快速排序

public class QuickSort {
	/**
	 * 快速排序
	 *选定一个数作为其关键字,把小于此关键字的放在左边,大于此关键字的放在右边,依次递归,最后都变成有序的
	 *一次快速排序的算法过程:
	 *1.选择器关键字,用两个变量lo,hi记录从开始和末尾扫描的位置
	 *2.从后往前扫面
	 *3.从前往后扫描
	 *直到lo>=hi时,一次排序技术
	 *迭代以上步骤,直到整个数组都有序
	 */
	
	//因为快速排序是采用迭代的方法执行的,所以把快速排序的一次排序提出来写成一个方法
	public static int quick(int lo,int[] a,int hi){
		//默认选择开始元素为关键字
		int key=a[lo];
		while(lo<hi){
			//先扫描后半部分
			while(key<a[hi]&&lo<hi){
				hi--;
			}
			a[lo]=a[hi];
			
			//扫描前半部分
			while(key>a[lo]&&lo<hi){
				lo++;
			}
			a[hi]=a[lo];
		}
     a[hi]=key;
     return hi;  //为什么返回hi了,因为hi是存储key值的位置,
	}
	
	//采用迭代直到每个都有序
	public static  void quickIteration(int lo, int[] a,int hi){
		if(lo>=hi)
			return;
		int partitionPoint = quick(lo, a, hi);
		//前面半部分迭代
		quickIteration(lo, a,partitionPoint-1);
		//后半部分迭代
		quickIteration(partitionPoint+1, a,hi);
	}
	
	public static void main(String[] args) {
		int[] a={12,2,1,13,4,21,45,6};
		quickIteration(0,a,7);
     System.out.println(Arrays.toString(a));
	}
}


时间复杂度为:O(NlogN)


快速排序的算法改进

1.对于小数据量的排序,快速排序并不比插入排序快

一般hi<lo+M     采用插入排序,M的值一般为5 —— 15,否则采用快速排序

2.

快速排序的时间复杂度和关键字的选取有很大的关系,快速排序选取关键字有三种方法:固定切分,随机切分,三取样切分,一般情况下,三取样切分是效率最高的,三数去中就是取开始元素,结束元素,中间元素的中间值作为key关键字

public class QuickSort {
	/**
	 * 快速排序
	 *选定一个数作为其关键字,把小于此关键字的放在左边,大于此关键字的放在右边,依次递归,最后都变成有序的
	 *一次快速排序的算法过程:
	 *1.选择器关键字,用两个变量lo,hi记录从开始和末尾扫描的位置
	 *2.从后往前扫面
	 *3.从前往后扫描
	 *直到lo>=hi时,一次排序技术
	 *迭代以上步骤,直到整个数组都有序
	 */
	
	//因为快速排序是采用迭代的方法执行的,所以把快速排序的一次排序提出来写成一个方法
	public static int quick(int lo,int[] a,int hi){
		
		//三数取样法选取关键字
		int mid=lo+(hi-lo)/2;
		if(a[mid]>a[hi]){
			swap(a[mid],a[hi]);
		}
		if(a[lo]>a[hi]){
			swap(a[lo],a[hi]);
		}
		if(a[mid]>a[lo]){
			swap(a[mid],a[lo]);
		}
		int key=a[lo];
		
		while(lo<hi){
			//先扫描后半部分
			while(key<a[hi]&&lo<hi){
				hi--;
			}
			a[lo]=a[hi];
			
			//扫描前半部分
			while(key>a[lo]&&lo<hi){
				lo++;
			}
			a[hi]=a[lo];
		}
     a[hi]=key;
     return hi;  //为什么返回hi了,因为hi是存储key值的位置,
	}
	
	//采用迭代直到每个都有序
	public static  void quickIteration(int lo, int[] a,int hi){
	  
		if(lo>=hi)
			return;
		int partitionPoint = quick(lo, a, hi);
		//前面半部分迭代
		quickIteration(lo, a,partitionPoint-1);
		//后半部分迭代
		quickIteration(partitionPoint+1, a,hi);
	}
	
	//两个数交换
	public static void swap(int x,int y){
		int temp=x;
		 x=y;
		y=temp;
	}
	public static void main(String[] args) {
		int[] a={12,2,1,13,4,21,45,6};
		quickIteration(0,a,7);
     System.out.println(Arrays.toString(a));
	}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值