交换排序--快速排序


个人理解快速排序的原理,定义两个标量,一个数的值是数组的第一位下标值(上标量)值为0,另一个是数组最后一位下标值(下标量)值为数组长度减1

首先从数组中选取的下标值为上标量的数,从数组最后一位开始向前比较,遇到第一个比选取值大的数,就交换位置,根据判断标识来判定是 上标量加一,还是下标量减一,

这时候就从数组选取下标值为下标量的数,从数组的下标为上标量的数进行比较,需要进行第一次交换,就交换位置,还是根据判断标识来判定是 上标量加一,还是下标量减

一,直到上标量和下标量的值相等,完成第一趟快速排序,这是数组就变成比最开始从数组选中的下标为上标量的值0小的数在它的前面,反之则在它的后面,分别对这两组进行快速排序,直到最后完成排序结束。


package change.sort;

public class QuickSort {
	public static void main(String[] args) {
		//声明数组
		int[] nums = {27,8,57,9,23,41,65,19,0,1,2,4,5};
		for (int i = 0; i < nums.length; i++) {
			System.out.print(nums[i]+"\t");
		}
		System.out.println();
		//应用快速排序方法
		quickSort(nums,0,nums.length-1);
		//显示排序后的数组
		for (int i = 0; i < nums.length; i++) {
			System.out.print(nums[i]+"\t");
		}
	}

	private static void quickSort(int[] a, int lo0, int hi0) {
		int lo = lo0;			//上标
		int hi = hi0;			//下标
		if(lo>hi){
			return;
		}
		//确定指针方向的逻辑变量
		boolean transfer = true;
		while(lo!=hi){
			if(a[lo]>a[hi]){
				//交换数字
				int temp = a[lo];
				a[lo]=a[hi];
				a[hi]=temp;
				//决定下标移动,还是上标移动
				transfer=(transfer==true)?false:true;
			}
			if(transfer){
				hi--;
			}else{
				lo++;
			}
			//显示每一次指针移动的数组数字的变化
			for (int i = 0; i < a.length; i++) {
				System.out.print(a[i]+",");
			}
			System.out.print("(lo,hi)="+"("+lo+","+hi+")");
			System.out.println("");
		}
	
		
		//将数组分开两半,确定每个数字的正确位置
		lo--;
		hi++;
		quickSort(a, lo0, lo);
		quickSort(a, hi, hi0);
	}
}

运行结果:


27	8	57	9	23	41	65	19	0	1	2	4	5	
5,8,57,9,23,41,65,19,0,1,2,4,27,(lo,hi)=(1,12)
5,8,57,9,23,41,65,19,0,1,2,4,27,(lo,hi)=(2,12)
5,8,27,9,23,41,65,19,0,1,2,4,57,(lo,hi)=(2,11)
5,8,4,9,23,41,65,19,0,1,2,27,57,(lo,hi)=(3,11)
5,8,4,9,23,41,65,19,0,1,2,27,57,(lo,hi)=(4,11)
5,8,4,9,23,41,65,19,0,1,2,27,57,(lo,hi)=(5,11)
5,8,4,9,23,27,65,19,0,1,2,41,57,(lo,hi)=(5,10)
5,8,4,9,23,2,65,19,0,1,27,41,57,(lo,hi)=(6,10)
5,8,4,9,23,2,27,19,0,1,65,41,57,(lo,hi)=(6,9)
5,8,4,9,23,2,1,19,0,27,65,41,57,(lo,hi)=(7,9)
5,8,4,9,23,2,1,19,0,27,65,41,57,(lo,hi)=(8,9)
5,8,4,9,23,2,1,19,0,27,65,41,57,(lo,hi)=(9,9)
0,8,4,9,23,2,1,19,5,27,65,41,57,(lo,hi)=(1,8)
0,5,4,9,23,2,1,19,8,27,65,41,57,(lo,hi)=(1,7)
0,5,4,9,23,2,1,19,8,27,65,41,57,(lo,hi)=(1,6)
0,1,4,9,23,2,5,19,8,27,65,41,57,(lo,hi)=(2,6)
0,1,4,9,23,2,5,19,8,27,65,41,57,(lo,hi)=(3,6)
0,1,4,5,23,2,9,19,8,27,65,41,57,(lo,hi)=(3,5)
0,1,4,2,23,5,9,19,8,27,65,41,57,(lo,hi)=(4,5)
0,1,4,2,5,23,9,19,8,27,65,41,57,(lo,hi)=(4,4)
0,1,4,2,5,23,9,19,8,27,65,41,57,(lo,hi)=(0,2)
0,1,4,2,5,23,9,19,8,27,65,41,57,(lo,hi)=(0,1)
0,1,4,2,5,23,9,19,8,27,65,41,57,(lo,hi)=(0,0)
0,1,4,2,5,23,9,19,8,27,65,41,57,(lo,hi)=(1,2)
0,1,4,2,5,23,9,19,8,27,65,41,57,(lo,hi)=(1,1)
0,1,2,4,5,23,9,19,8,27,65,41,57,(lo,hi)=(3,3)
0,1,2,4,5,8,9,19,23,27,65,41,57,(lo,hi)=(6,8)
0,1,2,4,5,8,9,19,23,27,65,41,57,(lo,hi)=(7,8)
0,1,2,4,5,8,9,19,23,27,65,41,57,(lo,hi)=(8,8)
0,1,2,4,5,8,9,19,23,27,65,41,57,(lo,hi)=(5,6)
0,1,2,4,5,8,9,19,23,27,65,41,57,(lo,hi)=(5,5)
0,1,2,4,5,8,9,19,23,27,65,41,57,(lo,hi)=(6,6)
0,1,2,4,5,8,9,19,23,27,57,41,65,(lo,hi)=(11,12)
0,1,2,4,5,8,9,19,23,27,57,41,65,(lo,hi)=(12,12)
0,1,2,4,5,8,9,19,23,27,41,57,65,(lo,hi)=(11,11)
0	1	2	4	5	8	9	19	23	27	41	57	65	




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值