Java实现快速排序

Java实现快速排序

快速排序的思想:首先我们从带排序的数组中找出一个标志数,然后交替遍历左边和右边将小于标志数的数放标志数的左边,大于标志数的数放在标志数的右边。这是一次排序排序完一次后则以标志数为界,小的在左边大的在右边。

接下来就是递归调用单次排序的函数。

第一次排序:
标志数x=8

8  5  9 10  11 2  4
4  5  9  10  11 2 4 
4  5  9  10  11 2 9 
4  5  2  10  11 2 9 
4  5  2  10  11 10 9 
=》4  5  2  8  11 10 9 

第二次排序:则排序标志数左边的数4  5  2
标志数x=4

2 4 5

整个数组2 4 5  8  11 10 9 

第三次排序:则排序标志数左边的数2
这时左右指针重合则跳出左递归,执行右递归

第四次排序:则排序标志数右边的数5  8  11 10 9
标志数5
5  8  11 10 9

第五次排序:由于上一次标志数的左边没有数则递归右边
8  11 10 9

第六步和第五步一样
11 10 9

第七步
9 10 11

第八步
2 4 5 8 9 10 11

 

package test;
/**
 * 快速排序
 * @author lanbing
 * @date 2018年9月20日
 *
 */
public class QuickQort2 {
	public static void main(String[] args) {
		int[] s = new int[] {8,5,4,7,9,10,25};
		for(int i:s) {
			System.out.print(i+" ");
		}
		quick_sort(s,0,s.length-1);
		System.out.println();
		for(int i:s) {
			System.out.print(i+" ");
		}
	}
	
	/**
	 * 进行一次排序
	 * @author lanbing
	 * @param targetArr 目标数组
	 * @param Left      左边指针
	 * @param Right     右边指针
	 * @return          返回左右相等时的下标
	 */
	public static int Qu_sort_one(int[] targetArr, int Left, int Right) 
	{
		int L = Left;
		int R = Right;
		int X = targetArr[L];
		
		while(L<R) {
			//如果右边的数大于X则右指针向左移
			while(L<R&&targetArr[R]>=X) {
				R--;
			}
			//如果右边的数大于X则交换
			if(targetArr[R]<X) {
				targetArr[L] = targetArr[R];
			}
			//如果左边的数小于X则左指针向右移
			while(L<R&&targetArr[L]<=X) {
				L++;
			}
			//如果左边的数大于X则交换
			if(targetArr[L]>X) {
				targetArr[R] = targetArr[L];
			}
			
		}
		targetArr[L] = X;
		
		return L;
	}
	
	/**
	 * 通过递归排序所有的数
	 * @author lanbing
	 * @param targetArr
	 * @param Left
	 * @param Right
	 */
	public static void quick_sort(int[] targetArr, int Left, int Right)
	{
		if(Left<Right) {
			//i为返回的排序一次后left和right相等时的下标
			int i = Qu_sort_one(targetArr,Left,Right);
			//递归左边范围则是Left到i-1
			quick_sort(targetArr,Left,i-1);
			//递归右边范围则是i+1到Right
			quick_sort(targetArr,i+1,Right);
			
		}

	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值