分治策略之快速排序
- 选一个基准(pivot)元素(任意位置)。
- 重新排序数列,比pivot小的放在pivot前面,比pivot大的放在pivot后面(相同的数可以放左边或者放右边),完成分区操作。
- 递归完成pivot两侧子数列的排序。
图形描述:
代码实现:
int partition(vector<int> &arr,int left,int right)
{
int pivot;
int i,j;
pivot=left;
i=j=left+1;
while(j<=right){
if(arr[j]<arr[pivot]){
swap(arr[i],arr[j]);
i++;
}
j++;
}
swap(arr[pivot],arr[i-1]);
return i-1;
}
void quickSort(vector<int> &arr,int left,int right)
{
int partitionIndex;
if(left<right){
partitionIndex = partition(arr,left,right);
quickSort(arr,left,partitionIndex-1);
quickSort(arr,partitionIndex+1,right);
}
}
时间复杂度:
- 最坏情况:数组划分后,每次pivot都排在单独的一侧,时间复杂度为O(n^2)。
- 最好情况:数组划分后,每次pivot都排在中间位置,时间复杂度为O(nlogn)。