快速排序的一种实现

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

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

快速排序(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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值