题目
click here
题解
传统快速排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| void quickSort(int a[], int l, int r) { if(l >= r) return ; int bas = a[l]; int i = l, j = r; while(i < j) { while(i < j && a[j] >= bas) j --; a[i] = a[j]; while(i < j && a[i] <= bas) i ++; a[j] = a[i]; } a[i] = bas; quickSort(a, l, i-1); quickSort(a, i+1, r); }
|
Hack数据1
严格单调有序的数组 时间复杂度会退化为O(n2) 解决方案:随机化数组或者随机取基准值(而非第一个)
1 2
| int id = l + rand() % (r - l + 1); int bas = a[id];
|
Hack数据2
所有数据都相等的数组 时间复杂度会退化为O(n2) 解决方案: 三路排序(详解点击)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } void quickSort(int a[], int l, int r) { if(l >= r) return ; int index = l + rand()%(r - l + 1); swap(&a[l], &a[index]); int bas = a[l]; int i = l, j = r, k = l + 1; while(k <= j) { if(a[k] == bas) k ++; else if(a[k] < bas) { swap(&a[k], &a[i]); i ++; k ++; } else { swap(&a[k], &a[j]); j --; } } quickSort(a, l, i-1); quickSort(a, j + 1, r); } int* sortArray(int* nums, int numsSize, int* returnSize){ int i; quickSort(nums, 0, numsSize-1); *returnSize = numsSize; return nums; }
|