算法
1.设置两个指针low,high分别指向数组的第一个元素和最后一个元素,设置第一个元素为参考元素key
2.先从右向左移动high指针直到找到比key值小的元素为止
3.从左向右移动low指针直到找到比key值大的元素为止
4.交换low指向的元素和high指向的元素
5.重复步骤3,4,5直到low指针与high指针相遇
6.将此时low指针指向的元素与元素key交换位置
7.递归排序左子序列
8.递归排序右子序列
代码
void QuickSort(int* arr,int first,int last)
{
//设定排序结束条件
if(first>=last)
{
return;
}
int t;
//1.设置两个指针low,high分别指向数组的第一个元素和最后一个元素
int low = first;
int high = last;
//2.设置第一个元素为参考元素key
//3.判断low指针是否和high指针相遇
while(low!=high)
{
//4.先从右向左移动high指针直到找到比key值小的元素为止
while(low!=high&&arr[high]>=arr[first])
{
high--;
}
//5.从左向右移动low指针直到找到比key值大的元素为止
while(low!=high&&arr[low]<=arr[first])
{
low++;
}
//6.交换low指向的元素和high指向的元素
t = arr[low];
arr[low] = arr[high];
arr[high] = t;
}
//7.将此时(low = high)的元素与第一个元素交换
t = arr[low];
arr[low] = arr[first];
arr[first] = t;
//8.递归调用QuickSort排序左子序列
QuickSort(arr,first,low-1);
//9.递归调用QuickSort排序右子序列
QuickSort(arr,low+1,last);
}
时间复杂度
最坏情况:O(n^2)
最优情况(第一次排序之后对半分):O(nlogn)
平均:O(nlogn)