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