把第一个元素作为中间值,采用递归
void QuckSort(vector<int> &arr, int left, int right) { int pivot = arr[left]; int i = left, j = right; while (i < j) { // while (arr[j] > pivot && i < j) j--; if (i < j) { arr[i] = arr[j]; while (arr[i] < pivot && i < j) i++; if (i < j) { arr[j] = arr[i]; j--; } } } arr[i] = pivot; if (left < i-1) QuckSort(arr, left, i-1); if (i+1 <right) QuckSort(arr, i+1, right); } void QuckSort(vector<int> &arr) { if (arr.size() <= 1) return; QuckSort(arr, 0, arr.size()-1); }
这个比较低效,教材上说低于10个数进行排序的话,快排没插入排序高效;同时,拿第一个元素值作为pivot,在已排序的数组情况下会变得效率很低,所以
取第一个,中间值和最后值得中值作为pivot比较保险,写法如下