排序算法-交换排序-快速排序详解

快速排序:

总的来说就是先找一个基数(一般以low作为基准数) 把比基准数大的放在基准数的右边比基数小的放在左边然后再对其左右进行排序

栗子:

以数组arr[] = { 2, 3, 8, 7, 1} 为栗子

首先要有两个指针 low 和high 以及基准数 在此以arr[low]作为基准数把比它大的放在它右边比它小的数放在它左边  temp 保存一下基准数的值 因为排序过程中它的值会被覆盖

temp =arr[low] =2
low   high
23871

然后先让 high指针左移 如果大于等于基准数则 high--  否则放在基准数前边

temp =arr[low] =2
low   ←high
23871

也就是赋值给low所在位置  arr[low] = arr[high]  

为什么要这么赋值?

因为 low 此时就相当于基准数的前边 high此时就相当于基准数的右边 移动low和high 当满足一定条件时就是基准数要放的位置

用high low 就是在找基准数要放的位置顺便把比他小的放前边比他大的放后边 你在纸上用笔想怎么移动就怎么移动但是数组是写死了需要你自己灵活的调整每个元素的位置 模拟移动这个过程最终实现的效果就是 (比他小的放前边比他大的放后边)

temp =arr[low] =2
low   high
13871

low位置值被修改了开始移动 low  让low指针右移 如果小于等于基准数则 low++  否则放在基准数后边  

temp =arr[low] =2
low→   high
1387

1

 

temp =arr[low] =2
 low→  high
1387

1

此时low位置值 大于基准数应该放后边 也就是赋值给high所在位置  arr[high] = arr[low]

temp =arr[low] =2
 low  high
1387

3

high位置的值被修改了 开始移动 high  让high指针左移如果大于等于基准数则 high--  否则放在基准数前边

temp =arr[low] =2
 low  ←high
1387

3

 

temp =arr[low] =2
 low ←high 
1387

3

 

temp =arr[low] =2
 low←high  
1387

3

 

temp =arr[low] =2
 

high

low

   
1387

3

此时 low<high 不满足条件 则不再移动 此时 low位置就是 准基数要放的位置 arr[low] =temp;

 
 

high

low

   
1287

3

然后再对基准数左边和右边进行排序即可 也就是{1} 和{8,7,3} 循环此过程即可 自己推导下

下一次结果应是 

low在上边 代表移动low到了此位置
 

 

 

  

low

high

1237

8

此时并没有完还有对 {3,7} 进行排序 才是真正的完成

 
 

 

 

high

low

 

 

 

1237

8

过程可能有点复杂,多拿几组数组自己试一试不过代码很简答

算法代码:

package test1;

import java.util.*;

public class Demo {
	public static void main(String[] args) {
		int arr[] = { 2, 3, 8, 7, 1};	
		quickSort(arr,0,arr.length-1);
	}

	private static void quickSort(int[] arr, int low, int high) {
//		递归跳出条件 不然会死循环
		if (low <high) {
//			我要说一下这个数组 传参传的是指向堆内存中的地址 所以形参数组改变了 实参也会变 			
//			指向的同一个地址 初学者 实参和形参可能会不太清楚
			int index = getIndex(arr,low,high);
//			很多博客都是 quickSort(arr,0,index-1); 这样会让程序多走n多遍不知道有什么用
//			按快排的规则就应该是对index左右再次进行排序 0应该是不对的虽然最后结果肯定对
			
//			分别对基准数的左边和右边进行排序
			quickSort(arr,low,index-1);
			quickSort(arr,index+1,high);
			
		}		
	}

	private static int getIndex(int[] arr, int low, int high) {
		int temp = arr[low];
		while(low < high) {
//			先让high和 基准数进行比较如果 arr[high] >=temp 说明 arr[high]就在基准数后边
			while(low < high && arr[high] >=temp) {
				high--;				
			}
//			此时arr[high] 值小于基准数 应该放基准数前边 也就是low这个位置 你总不能说随便放吧
//			所以快排才有了 low high 两个指针
			arr[low] =arr[high];
//			然后让 low和 基准数进行比较如果 arr[low] <=temp 说明 arr[low]就在基准数左边
			while(low < high && arr[low] <=temp) {
				low++;				
			}
//			此时arr[low] 值大于基准数 应该放基准数右边 也就是high这个位置
			 arr[high]= arr[low];
			
		}
//		当low<high 时跳出 此时low位置就是基准数应该放的位置
		arr[low] =temp;
		System.out.println(Arrays.toString(arr));
		return low;
	}
	
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值