欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java实现快速排序

程序员文章站 2022-03-24 18:25:15
...

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);
			
		}

	}
}

 

相关标签: 快速排序 Java