快速排序的一种实现

来源:互联网 发布:淘宝个性家具店铺名字 编辑:程序博客网 时间:2024/05/20 22:04

百度百科中关于快速排序的介绍是这样的:

快速排序即快速排序算法。

快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

参考快排的思想,自己写了个程序,主要思路如下.
这里排序的最终结果是从小到大。假设数组为a,选择待排序的的数组的首个元素为哨兵,及轴元素,设置两个素组下标i及j,下标i表示i左侧的原色均比哨兵元素小,下标j排序的具体表示j右侧的元素均比哨兵元素大。在每一趟排序中,要求达到的效果是排序的数据依据哨兵元素分成两个部分,哨兵左侧数据都比哨兵元素小,哨兵右侧数据逗比哨兵大。

排序的具体过程:
1.i初始化为数组a的首个元素位置(一般是0),j初始化为数组最后一个元素的位置(一般是数组长度-1),此时哨兵元素为数组a[i]
2.选择待排数组的第i元素,然后在数组中从右往左查找,找到第一个比哨兵元素小的值,则把该值填到位置i处,同时下标i进行+1操作,结束查找
3.从数组i的位置从左往右查找,找到第一个比哨兵元素大的值,将该值填到下标j处,同时下标j进行-1操作,结束查找
4.循环进行步骤2,3知道下标i与j重合,此时将步骤1中的哨兵元素填充到下标i处,完成一趟排序。
5.经过以上步骤之后,在下标i左边的元素均比i小,在i右边的元素均比i大,此时对左侧及右侧递归进行相同的排序即可,即分别对左侧的数组重复进行步骤1,2,3,4,右侧数组进行1,2,3,4的操作。
具体代码如下:
void quickSort(int data[],int begin,int end){if(begin>=end)//如果数组只有一个元素或者以下,则不用进行排序操作return;int i=begin;//表示小于哨兵元素的下标int j=end;//表示大于哨兵元素的下标int key = data[begin];//取待排序的数组范围内的第一个元素作为哨兵while(i<j){for(;j>i;j--){if(data[j]<data[i]){//从右往左进行查找,将找到的第一个小于哨兵的元素挪到数组左侧data[i]=data[j];break;}}for(;i<j;i++){if(data[i]>key){//从左往右查找,将找到的第一个小于哨兵的元素挪到右侧data[j]=data[i];break;}}}data[i]=key;//将哨兵元素填充到它的位置,(while循环结束)完成一趟排序,此时哨兵元素(位置为i)左侧都比它小,右侧都比它大quickSort(data,begin,i-1);//递归处理左侧的数组quickSort(data,i+1,end);//递归处理右侧的数组}
调用方式:
int _tmain(int argc, _TCHAR* argv[]){int data[] = {5,3,2,3,7,1};int length = sizeof(data)/sizeof(data[0]);//计算数组长度quickSort(data,0,length-1);for(int i=0;i<length;i++){cout<<data[i]<<" ";cout<<endl;}system("pause");return 0;}

以上代码在VS2012中编译通过。


0 0
原创粉丝点击