网上的快排很多,差别主要在R侧的while结束发现小于/大于基准值的元素并将其移动到L侧时是否带有++/--的操作,因为已经确定了位置,所以用L++来跳过似乎无可厚非。
对于本身是有序的序列,第一个while已经将R减到0了,排序应该结束。但是由于没有进行判断,所以会执行后面的L++,从而出现a[0]=a[1]的操作
void quickSort(int* a, int i, int j) {
if (i >= j) return;
int l = i, r = j, key = a[i];
while (r > l) {
while (r > l && a[r] >= key)r--;//如果序列本身就是排好序的,r=0,遍历结束
a[l] = a[r];//swap(a[l],a[r]); //if (r > l)a[l++] = a[r];
while (r > l && a[l] <= key)l++;
a[r] = a[l];//swap(a[l],a[r]); //if (r > l)a[r--] = a[l];
}
a[l] = key;
quickSort(a, i, l - 1);
quickSort(a, l + 1, j);
}
void test02() {
int a1[] = { 49,38,65,97,76,13,27,49 };
int a[] = { 1,2,3,4,5,6 };
quickSort(a, 0, sizeof(a) / sizeof(a[0]) - 1);//下标
for (const int i : a)cout << i << ' '; cout << endl;
}