算法笔记(三)——分治法(快速排序)

 参考了网上大神的理解后,自己也尝试着写下传说中的“快速排序”。

 参考链接:https://blog.youkuaiyun.com/morewindows/article/details/6684558

 大致思路总结为:挖坑填坑+分治法。

 举个例子:我们对数组a[9]={6,2,4,3,7,1,5,0,8}进行分析。

       首先我们拿数组中的随机一个数作为基准数(参照对象,也就是要挖的坑),把基准数变成坑(用“X”来表示),然后我们把它和数组的第一个数位置交;,比如我们拿到的基准数为5,那么新数组顺序变为 

    X 2 4 3 7 1 6 0 8

      然后我们从最右边开始找,找到第一个比X小的数,我们找到了0,然后把0赋值给X,(我们不把这两个数进行交换操作的原因是为了代码简洁并且提高程序效率),这样0的位置就变成了一个新坑X,记为     

    0 2 4 3 7 1 6 X 8

然后我们从0的下一个位置开始,找到第一个比X大的数,我们找到7,然后把7赋值给X,然后7的位置变成新坑,记为

    0 2 4 3 X 1 6 7 8

      然后我们从7的下一个位置开始,找到第一个比X小的数,找到1,把1赋值给X,1变X,记为

    0 2 4 3 1 X 6 7 8

      然后我们发现1的下一个位置和坑X的位置是一样的,那么,我们就把基准数5填到坑X里。这样,我们已经把比基准数大的数全部放到了基准数的右边,比它小的全部放到了左边;记为

    0 2 4 3 1 5 6 7 8

      然后我们分别对基准数的左边和右边的子数组再进行挖坑填坑,直到最后的子数组里只有一个元素。

      代码如下:

void quick_sort(int a[],int left,int right){
	if(left<right){
		srand(time(NULL));
		int k=left+rand()%(right-left+1);
		swap(a[k],a[left]);
		int x=a[left],i=left,j=right;
		while(i<j){
			while(i<j&&a[j]>=x)
				j--;
			if(i<j)
				a[i++]=a[j];
			while(i<j&&a[i]<x)
				i++;
			if(i<j)
				a[j--]=a[i]; 
		}
		a[i]=x;
		quick_sort(a,left,i-1);
		quick_sort(a,i+1,right); 
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值