算法导论-第7章

    关于快速排序,前面数据结构曾经说过一次,写推荐看快速排序有关概念—推荐

关于快速排序,

1.找到一个枢纽元。

2.第二把小于它的放左边,把大于它的放另外一边,自己则放在中间。

3.重复这个过程,再分别对2个左边,右边的序列完成一次快速排序。

怎么找枢纽元?

    这个就是这个快速排序的各种变形了,比如书上说了选最后一个元素,其实,根据不同的选择就会有不同的变形。

具体请看这里3种快排

最后,就是无非分析这个算法,是多么多么的好,你只要记住最坏情况为o(n2),而一般情况为o(nlgn)就够了。

这里我说一种,三数中值分割的快速排序。代码如下:

public class quick_sort {
		public static void quicksort(int [] a){
			quicksort(a,0,a.length-1);
		}
		private static void quicksort(int [] a,int left,int right){
			if(left<=right){
				int pivot=median(a,left,right);
				int i=left,j=right-1;
				for(;;){
					while(a[++i]<pivot){}
					while(a[--j]>pivot){}
					if(i<j) swap(a,i,j);
					else
						break;
				}
				quicksort(a,left,i-1);
				quicksort(a,i+1,right);
			}
		}
		private static int median(int [] a,int left,int right){
			int center=(left+right)/2;
			if(a[center]<a[left])
				swap(a,left,center);
			if(a[right]<a[left])
				swap(a,left,right);
			if(a[right]<a[center])
				swap(a,center,right);
			swap(a,center,right-1);
			return a[right-1];
		}
}
    关于快速排序,具体的实现,可以说是各种各样,都可以,但最起码,你必须知道它的思想,它在做什么?如何做?这个策略就决定了你的写法,像上面,你可以在median函数中,完成对这个序列的分割,也可以写在主函数里面,这都是完全由个人所决定的。

想了解更多,推荐大家看上面我给的两个连接,很详细了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值