package demo.Sort;
import java.util.Arrays;
import java.util.Random;
public class QuickSort {
private static int count=0;
private int division(int[] list, int left, int right) {
//以最左边的数为基准
int base = list[left];
while (left < right) {
//从最右边开始,向左遍历,直到找到小于base的值ֵ
while (left < right && list[right] >= base)
right--;
//找到了比base小的元素,放到最左边的位置
System.out.println("替换:"+list[left]+"<="+list[right]);
list[left] = list[right];
//从序列左边开始,向右遍历,直到找到大于base的数
while (left < right && list[left] <= base)
left++;
System.out.println("替换2:"+list[left]+"=>"+list[right]);
//找到了比base大的元素,将这个元素放到right的位置
list[right] = list[left];
}
//最后将base放到left的位置。此刻left的位置的左侧数值应该都比left小
list[left] = base;
return left;
}
private void quickSort(int[] list, int left, int right) {
//左角标小于右角标 否则就越界了
if (left < right) {
//System.out.println("left=" + left + ",right=" + right + " :" + Arrays.toString(list));
//对数组进行分割,取出下次分割的基准编号
int base = division(list, left, right);
count++;
System.out.println("第"+count+"轮 base=" + base + ",left=" + left + ",right=" + right + " :" + Arrays.toString(list));
//对基准编号左侧的数进行分割,以至于这些数值完整的排序
quickSort(list, left, base - 1);
//对基准编号右侧的数进行分割,以至于这些数值完整的排序
quickSort(list, base + 1, right);
}
}
//快速排序详细实例过程 http://jingyan.baidu.com/article/d45ad148905ccf69552b80d9.html
public static void main(String[] args) {
// TODO Auto-generated method stub
final int MAX_SIZE = 20;
int[] arry = new int[MAX_SIZE];
Random r = new Random();
for (int i = 0; i < MAX_SIZE; i++) {
arry[i] = r.nextInt(MAX_SIZE);
}
//arry= new int[]{63,55,48,37,20,90,84,32};
//http://jingyan.baidu.com/article/d45ad148905ccf69552b80d9.html
arry=new int[]{66,13,51,76,81,26,57,69,23};
System.out.println(Arrays.toString(arry));
QuickSort quick = new QuickSort();
quick.quickSort(arry, 0, arry.length - 1);
for (int value : arry) {
System.out.print(value + "\t");
}
}
}
Java快速排序原理理解
最新推荐文章于 2022-08-18 20:57:33 发布