voidquickSort(intarray[],int l,int r){ if(l >= r) return; int x = array[l]; int i = l - 1, j = r + 1; while (i < j){ do i++; while (array[i] < x); do j--; while (array[j] > x); if(i < j) swap(array[i],array[j]); } quickSort(array,l,j); quickSort(array,j+1,r); }
voidquickSort(intarray[],int l,int r){ if(l >= r) return; int x = array[l]; int i = l - 1, j = r + 1; while (i < j){ while (array[++i] < x); while (array[--j] > x); if(i < j) swap(array[i],array[j]); } quickSort(array,l,j); quickSort(array,j+1,r); }
intquickSearch(int *array,int l,int r,int k){ if(l >= r) returnarray[l]; int x = array[l], i = l - 1, j = r + 1; while (i < j){ while (array[++i] < x); while (array[--j] > x); if(i < j) swap(array[i],array[j]); } int sl = j - l + 1; if(k <= sl) return quickSearch(array,l,j,k); return quickSearch(array,j+1,r, k - sl); }
归并排序
步骤
确定分界点mid:mid = (l + r) / 2
递归排序Left,Right
合并
始终保持O(logn)的时间复杂度,但会牺牲额外数组空间。
模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
voidmerge_sort(int *q,int l,int r){ if(l >= r) return; int mid = (l+r) / 2; merge_sort(q,l,mid); merge_sort(q,mid+1,r); int k = 0, i = l, j = mid + 1;// i j分别为两个数组的指针,双指针 while (i <= mid && j <= r){ if(q[i] < q[j]) tmp[k++] = q[i++]; else tmp[k++] = q[j++]; } //当一方数组的指针到尾,将另一个数组内的数全部移入tmp临时数组 while (i <= mid) tmp[k++] = q[i++]; while (j <= r) tmp[k++] = q[j++];