java快速排序详解

十大经典排序之一

这次研究一下快速排序,理解为找一个基准值,比他小的在他左边,比他大的在右边,然后反复循环这样的一分为二的步骤,知道无法改变位置,排序就此完成。

假设我们现在对“6  1  2 7  9  3  4  5 10  8”这个10个数进行排序

步骤1,选择左边第一位为 基准值,数组可以看作为,6 [1 ,2 ,7 ,9 , 3 , 4 , 5 ,10,  8]

首先最右边向左移,比6小的第一个数字是5

最左边向右移,比6大的第一个数字是7,

进行一次交换,6,[1 ,2 ,,9 , 3 , 4 ,7 ,10,  8]

然后再一次从 5和7的位置重复步骤一

可以看到最右边向左移,比6小的第一个数字是4

最左边向右移,比6大的第一个数字是9,

进行一次交换,6,[ 1 ,2 ,5 ,4 , 3 , 9 ,7 ,10,  8 ]

再一次重复以上步骤,发现右边向左移动的角标位置在3的位置不能动了,再移动就要碰上左边右移的位置了,而且3满足了比基准值小的要求,进行基准值的替换

变为 3,[1 ,2 ,5 ,4 , 6 , 9 ,7 ,10,  8]

此时第一次的循环完成了。     6的左边都是比他小的,右边都是比他大的

[3,1 ,2 ,5 ,4 , 6 , 9 ,7 ,10,  8]

再一次循环比较,但是此时可以看做2个数据了。 分别是    左边和右边

[3,1 ,2 ,5 ,4 ] 6 [ 9 ,7 ,10,  8]

 [3,1 ,2 ,5 ,4 ] 做比较

3[1,2,5,4] ->最右角标在左移是到2的位置,最左向右移动时到2的位置,选择替换为 [2,1,3,5,4] 再次分割为2个数组,[2,1]3以及[5,4]

再次排序[2,1]和[5,4], 2为基准,比1大,换位,5为基准比4大,换位

[ 9 ,7 ,10,  8]看这一组数据 将9拿出来9[7,10,8]  首先从右向左移,找到8比基准小,然后从左向右移,找到10比基准大,进行换位  变成9[7,8,10],然后替换基准值为 [7,8,9,10] 分为左边数组[7,8]9以及右边[10]

对[7,8]进行排序,已经是顺序了

奉上代码可以进行测试

package JavabaseMAV.JavabaseMAV.paixu;

import java.util.Random;

public class mykuaipai {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		Random ran=new Random();
		int[] array = new int[100];
		for (int i = 0; i < 100; i++) {
			array[i]=ran.nextInt(1000);
		}
		
		int[] sorted = sort(array);
		System.out.println("最终结果");
		for (int i : sorted) {
			System.out.print(i + " ");
		}

	}

	private static int[] sort(int[] array) {
		return quickSort(array, 0, array.length - 1);
	}

	private static int[] quickSort(int[] arr, int left, int right) {
		// 左边不能大于等于右边 否则返回 { 1, 3, 2, 5 };
		
		if (left >= right) {
			return arr;
		}
		// 设置最左边的为基准点p
		int p = arr[left]; //1
		int i=left;
		int j=right;
		// 吧排序中比p大的放右边 比p小的放左边
		 while(i<j){
			 //最右边的j左移找到一个比p小的值,并且角标不能小于等于最左向右移的角标,不可碰撞
			 while(arr[j]>=p&&i<j){
				 j--;
			 }
			 //i右移找到一个比p大的,并且角标不能大于等于最左向右移的角标,不可碰撞
			 while(arr[i]<=p&&i<j){
				 i++;
			 }
			 //i和j交换  找到一对这样的值了,进行位置互换
			 if(i<j){
				 int temp=arr[i];
				 arr[i]=arr[j];
				 arr[j]=temp;
			 }
		 }

                 //完成了一次基准值的比较,现在左边全是比基准小的,右边全是比基准大的
                 //更换排序的基准位置以及比较值
                arr[left]=arr[i];
		 arr[i]=p;
		// 基准值的左边排序
		 quickSort(arr,left,i-1);
		// 基准值的右边排序
		 quickSort(arr,i+1,right);
		return arr;
	}

}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值