[数据结构]原创!amor详解 快速排序 使用以及心得

amor详解 快速排序 使用以及心得

 这是针对快速排序的详解,可以还不是很清楚,希望大家指正原文来自 http://www.liaoguodong.cn  作者 amor  欢迎大家前来!!

   前言:快速排序作为专家测试,公认的最快的排序算法,相比冒泡排序,选择排序,插入排序等低级排序而言,是一个优秀的排序算法.对于初学者和兴趣爱好者有着较好的教学目的.在这人,我详解一下快速排序的原理,以及心得

  

快速排序的原理:

第一步:取第一个值为参考值mid

第二步:设立两个指针(下标),i指向第一个元素,j指向最后一个元素

第三步:从j开始逐步向前找一个小于mid的数与其交换

第四步:从i开始逐步向后找一个大于mid的数与其交换

如果i,j不相遇,那么重复第三步和第四步

    快速排序的思想:将一个大的问题划分为一个小的问题,再这个小的问题细分

   快速排序之所以快速,首先来说在时间上:快速排序的执行时间为=nlog2N 

而低级排序为=n*n

那么就显而易见了,例如一个100个数字,那么低级排序的时间为100*100=10000O

注意O,为时间单位  

而同样的100个数字,快速排序的时间为=100*log2100  =700

所以,在时间上,快速排序大大的超过了以往的低级排序速度

此图请结合下面代码一起阅读

下面是代码,使用,测试方法,直接将以下代码,复制,执行就可以了!

import java.util.Arrays;


public class 快速排序 {
	public static void fastsort(int []a ,int left,int right){
		/*
		 * 快速排序的原理:
			第一步:取第一个值为参考值mid
			第二步:设立两个指针(下标),i指向第一个元素,j指向最后一个元素
			第三步:从j开始逐步向前找一个小于mid的数与其交换
			第四步:从i开始逐步向后找一个大于mid的数与其交换
			如果i,j不相遇,那么重复第三步和第四步
		 * */
		//取参考值
		int mid = a[left];
		//设定两个指针
		int i=left; 
		int j=right;
		/*
		 * 
		 * */
		
		while(i<j){
			//从j开始向前找一个小于mid的数与其交换  保证i和j不相等
			/*
			 * 此处不易懂,所以详细讲解一下。   当a[j]>mid的时候,那么表示此数比mid大,那么这一位不动,然后把j的位置向前移动,然后又判断
			 * 当条件不符合的时候表示a[j]<mid,那么就是这个值比参考值要小,那么更进入if判断,和mid交换位置,从而达到mid的左边的值全部比mid大
			 *   注意:a[j]>=mid当不等于的时候,那么当数组有等等的数的时候,循环会陷入死循环的位置.切记!!!
			 * */
			while(i<j&&a[j]>=mid){
				j--;
			}
			if (i<j) {
				int b=a[i];
				a[i]=a[j];
				a[j]=b;
			}
			/*
			 * 此处同上,保证mid右边的值全部比mid小
			 * 
			 * */
			
			//从i开始向后找一个大于mid的数与其交换
			while(i<j&&a[i]<=mid){
				i++;
			}
			if (i<j) {
				int b=a[i];
				a[i]=a[j];
				a[j]=b;
			}
				
		}
		/*
		 * 例如:原数组为int[] a={5,1,7,9,3,2,4,6,8};
		 * 那么在这人的排序后,会变成 5居中,1,3,2,4在5的右边,但是不一定是有顺序的,,只能保证5的右边都比5小,那么,左边同理
		 * */
		
		//i j相遇,就以mid为断点,左边的全小,右边全大
		//左边有数才快速排序
		if(left<i){
			/*在这儿使用了递归,自己调用自己的方法,当i和j相等时候就表示已经完成了排序
			 * */
			fastsort(a, left, i-1);
		}
		if(j<right){
			fastsort(a, j+1, right);
		}
		
	}
	
	public static void main(String[] args) {
		
		int [] a={4,5,5,3,2,4,6,7,9,3};
//		int[] a={5,1,7,9,3,2,4,6,8};
		/*
		 * Arrays.sort(a);这是一个比较简单的排序方式,但是原理仍然是使用的快速排序,只是被封装了而已
		 * */
	//	Arrays.sort(a);
		fastsort(a, 0, a.length-1);
		for(int i=0;i<a.length;i++){
			System.out.print(a[i]+"\t");
		}
	}
}

这是针对快速排序的详解,可以还不是很清楚,希望大家指正原文来自 http://www.liaoguodong.cn  作者 amor  欢迎大家前来!!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值