- 分而治之
- 主元的选择:low、中间
- 子集的划分:
不藏/记录主元:交换
藏主元:左右分别前进,后交换/替换 - 问题:递归(尾递归改进)、小规模数据(设置比较数据个数的阈值)、不稳定
- 复杂度
//快速排序(从小到大) void quickSort(vector<int>& arr,int left, int right) { if(left >= right) return; if(left < 0 || right >= arr.size()) { cout << "error args! array bound." << endl; return; }//非法输入判断,防止数组越界 if(Cutoff<=right-left) { int i, j, base, temp; i = left, j = right; /**优化base的取值:left,right,mid中间的数 int mid=left+(right-left)/2; if(arr[mid]>arr[left]) swap((arr[mid],arr[left]); if(arr[left]>arr[right]) swap((arr[left],arr[right]); if(arr[mid]>arr[right]) swap((arr[mid],arr[right]);//left为中间值 **/ base = arr[left]; //取最左边的数为基准数 while (i < j) { while (arr[j] >= base && i < j) j--; while (arr[i] <= base && i < j) i++; if(i < j) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } else break; } //基准数归位 arr[left] = arr[i]; arr[i] = base; quickSort(arr,left, i - 1);//递归左边 quickSort(arr,i + 1, right);//递归右边 //这一句可以优化为尾递归:left=i+1; } else //进行直接插入排序 }
int partition(vector<int> &nums,int l,int h)
{
int pivot=nums[l];
while(l<h)
{
while(l<h && nums[h]>=pivot) --h;
nums[l]=nums[h];
while(l<h && nums[l]<=pivot) ++l;
nums[h]=nums[l];
}
}</int>
void quicksort(vector<int> &nums,int l,int r)
{
if(l<r)
{
int pos=partition(nums,l,r);
quicksort(nums,l,pos);
quicksort(nums,pos+1,r);
}
else return;
}</int>