快速排序
如果要排序数组中下标从 p 到 r 之间的一组数据,我们选择 p 到 r 之间的任意一个数据作为 pivot(分区点)。我们遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间。经过这一步骤之后,数组 p 到 r 之间的数据就被分成了三个部分,前面 p 到 q-1 之间都是小于 pivot 的,中间是 pivot,后面的 q+1 到 r 之间是大于 pivot 的。根据分治、递归的处理思想,我们可以用递归排序下标从 p 到 q-1 之间的数据和下标从 q+1 到 r 之间的数据,直到区间缩小为 1,就说明所有的数据都有序了。
最优时间复杂度 O(nlogn)
平均时间复杂度O(nlogn)
最差时间复杂度O(n^2) 假设此时数组已经为有序了,但是我们仍未一直设置末尾的那个值为pivot。
其于归并排序相比优点为:他的时间复杂度为O(1)。所以就算其最差时间复杂度可能退化到O(n^2),仍为人们倾向于使用的算法,而且现在人们研究出了很多措施来尽量避免其退化到 O(n^2)
代码:
#include <iostream>
#include <vector>
using namespace std;
int getPartition(vector<int>& nums,int head,int rear)
{
int value=nums[rear];
int i=head,j=0,temp=0;
for(j=head;j<rear;j++)
{
if(nums[j]<value)
{
temp=nums[j];
nums[j]=nums[i];
nums[i]=temp;
i++;
}
}
temp=nums[rear];
nums[rear]=nums[i];
nums[i]=temp;
return i;
}
void quickSort(vector<int>& nums,int head,int rear)
{
if(head>=rear)
{
return;
}
else
{
int loc=getPartition(nums,head,rear);
quickSort(nums,head,loc-1); //注意要是-1而不能这里是loc下一行是加1
quickSort(nums,loc+1,rear);
}
}
int main()
{
vector<int> test;
test.push_back(5);
test.push_back(13);
test.push_back(13);
test.push_back(7);
test.push_back(19);
test.push_back(12);
test.push_back(4);
test.push_back(6);
test.push_back(1);
test.push_back(2);
test.push_back(3);
test.push_back(8);
for(int i=0;i<test.size();i++)
{
cout<<test[i]<<" ";
}
cout<<endl;
int qsize=test.size();
quickSort(test,0,qsize-1);
for(int i=0;i<test.size();i++)
{
cout<<test[i]<<" ";
}
return 0;
}