排序算法之经典快排(重点)

算法特点,以某个记录为界(该记录称为支点活枢轴),将待排序列分成两部分:一部分大于等于支点记录的关键字,另一部分小于支点记录的关键字。意思就是每次排完一趟,左边的比枢轴小,右边的比枢轴大。游标high用于搜索比枢轴小的记录,游标low用于搜索比枢轴大的记录,搜索就和枢轴交换并切换游标。 大概意思就是把数组分为两个子数组和一个元素,在子数组当中继续进行,递归操作。在ACM使用的快排中,我们确定枢轴,我们让左边比枢轴大的,右边比枢轴小的交换,最后当左边游标和右边游标碰头的时候,就将枢轴和此位置的元素交换,这样枢轴值交换了一次,从而进行了优化。为了防止因为有序而每次只能排一个元素和一个子数组,我们用一个随机数来确定枢轴交换到第一个元素的位置,从而减少了因为有序而引发的效率底的概率。鄙视我们要注意两个数值交换,不要冲掉数,借用第三变量来实现交换。枢轴我们定义一个变量等于它,交换的时候就比较方便了。

package cn.hncu.sorts;

public class SortWay2 {
	//输出函数
	private static void print(int[] a) {
		for(int num:a){
			System.out.print(num+" ");
		}
		System.out.println();
	}
		//交换数组位置函数
	private static void swap(int[] a, int j, int i) {
		int temp;
		temp=a[i];
		a[i]=a[j];
		a[j]=temp;
	}
	
	//quickSort
	private static void quickSort(int[] a, int p, int r) {
		if(p<r){
			//把数组划分成两个子数组和一个元素
			int q=partition(a,p,r);
			quickSort(a, p, q-1);
			quickSort(a, q+1, r);
			
		}
	}
	private static int partition(int[] a, int p, int r) {
		//快排的优化----随机选取数列中的一个元素当作枢轴---交换到第1个元素的位置
		int rand=(int)(Math.random()*(r-p));
		swap(a, p, p+rand);
		int x=a[p];//第1个元素为枢轴
		int i=p;//在左侧搜索的游标:找大
		int j=r+1;//在右侧搜索的游标:找小
		while(true){
			while(a[++i]<x && i<r);//在左侧定位到比枢轴大的数
			while(a[--j]>x);//在右侧定位到比枢轴小的数
			if(i>=j){
				break;
			}
			swap(a, i, j);
		}
		//把枢轴换到小值区的最后一个元素的位置
		swap(a,p,j);
		return j;
	}

	
	public static void main(String[] args) {
		int[] a={21,22,5,7,86,57,9,-2,37,-8};
		//快速排序
//		quickSort(a,0,a.length-1);
		print(a);
	}
}

代码实现如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值