快速排序

	public static int partition(int[] a,int lo,int hi){
		int i = lo , j = hi + 1;
		int v = a[lo];
		while(true){
			while((a[++i]-v) < 0) {
//				if(i == hi){
//					break;
//				}
			}
			while((v-a[--j]) < 0) {
//				if(j == lo){
//					break;
//				}
			}
			
			if(i >= j) {
				break;
			}
			
			exch(a,i,j);
		}
		exch(a,lo,j);
		return j;
	}

快速排序的核心——partition分割:在数组a中,选定第一个元素为标准元素(为了排除对输入了依赖性,在此函数调用之前对数组随机打乱),使i,j分别指向要比较数组的头与尾,while((a[++i]-v) < 0)与while((v-a[--j]) < 0) 分别指向从左至右小于/ 从右至左大于标准元素的元素的位置。并将它们的位置交换。当i>=j时,将标准元素放置数组中合适的位置上。


	public static void quickSort(int[] a){
		quickSort(a, 0, a.length - 1);
	}
	
	public static void quickSort(int[] a,int lo,int hi){
		if(hi <= lo) return;
		int j = partition(a,lo,hi);
		quickSort(a,lo,j-1);
		quickSort(a,j+1,hi);
	}


递归调用发生在分割数组之后(与自顶向下的归并排序处理数组在归并之前),快速排序平均时间复杂度NlnN,最坏时间复杂度N平方。


当待排序数组中有大量重复元素时,可采用三取样切分来分割数组。

private static void sort(int[] a,int lo,int hi){
		if(hi <= lo) return;
		int lt = lo, i = lo+1, gt = hi;   //li,i,gt 分别为< = > 标准数的位置
		int v = a[lo];
		
		while(i <= gt)
		{
			int b = a[i] - v;
			if(b < 0) exch(a,lt++,i++);
			else if(b == 0) i++;
			else if(b > 0)  exch(a,i,gt--);
		}
		
		sort(a,lo,lt-1);
		sort(a,gt+1,hi);
	}

在有大量重复数据时,三向切分排序的性能比快速排顺序好(最坏情况就是所有主键都不相同),可达到线性级别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值