您的位置:首页 > 产品设计 > UI/UE

快速排序算法QuickSort

2011-06-15 20:50 197 查看

1.说明

快速排序法(quicksort)是目前所公认最快的排序方法之一(视解题的对象而定),虽然快速排序法在最差状况下可以达O(n2),但是在多数的情况下,快速排序法的效率表现是相当不错的。快速排序法的基本精神是在数列中找出适当的轴心,然后将数列一分为二,分别对左边与右边数列进行排序,而影响快速排序法效率的正是轴心的选择。这边所介绍的第一个快速排序法版本,是在多数的教科书上所提及的版本,因为它最容易理解,也最符合轴心分割与左右进行排序的概念,适合对初学者进行讲解。

2.解法

这边所介绍的快速演算如下:

一趟快速排序的算法是:

设置两个变量start、end,排序开始的时候:start=1,end=N;

以第一个数组元素作为关键数据,赋值给pivot,即 pivot=arry[1];

从end开始向前搜索,即由后开始向前搜索(end--),找到第一个小于pivot的值arry[end],并与arry[start]交换,即swat(arry,start,end);

从start开始向后搜索,即由前开始向后搜索(start++),找到第一个大于pivot的arry[start],与arry[end]交换,即swat(arry,start,end);

重复第3、4步,直到 start==end,这个时候arry[start]=arry[end]=pivot,而pivot的位置就是其在整个数组中正确的位置;

通过递归,将问题规模不断分解。将pivot两边分成两个数组继续求新的pivot,最后解出问题。

3.代码实例

View Code

int Partition(int arry[],int start,int end)//通过这一步保证了轴心位置被正确分配
{
cout<<"轴心数组"<<endl;
for(int i=start;i<=end;i++)
cout<<arry[i]<<" ";
cout<<endl;
int pivot=arry[start];//轴心元素
while(start<end)
{
//当末尾的元素大于轴心元素值时,不做处理,让尾指针往前跳
while(start<end&&arry[end]>=pivot)
end--;
//找到第一个不满足arry[end]>pivot的元素,让其arry[end]和arry[start]互换
swap(arry,start,end);
//当前端的元素小于轴心元素时,不对元素做任何处理,让头指针往尾部跳
while(start<end&&arry[start]<=pivot)
start++;
//找到第一个不满足arry[start]<=pivot的元素,让其arry[end]和arry[start]互换
swap(arry,start,end);
}
//输出轴心位置
cout<<"输出轴心位置:"<<start<<endl;

/*由于前面
while(start<end&&arry[end]>pivot)和while(start<end&&arry[start]<pivot)的限定,
保证了最后不会出现low>high的情况,因此最后low=high,该位置就是轴心元素在数组中的位置。
*/
return start;//轴心位置
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: