package com.test.sort;
public class KuaiSuSort {
public void printSort(int[] arr) {
StringBuilder sbu = new StringBuilder();
sbu.append("[");
for (int i = 0; i < arr.length; i++) {
if(i == arr.length -1) {
sbu.append(arr[i] + "]");
}else {
sbu.append(arr[i] + ",");
}
}
System.out.println(sbu.toString());
}
/**
* 标记一个数字,然后将所有数分为两部分,一部分比他大的放他右边,一部分比他小的放左边
* 再利用递归不断按上面排序
* @param arr
* @param low
* @param high
*/
public void kuaiSuSort(int[] arr,int low,int high) {
//最小循环数
int start = low;
//最大循环数
int end = high;
//标记数
int key = arr[low];
//整体大循环 将所有数 分为两部分 比标记数 大的放在标记数右边 ,比标记数小的放在标记数左边
while(start < end) {
//从后开始,从后往前,将小的放在标记数key前面,如果比key大就跳过 end--
while(start < end && arr[end] >= key) {
end --;
}
//将小于key的放前面
if(arr[end] <= key) {
int temp = arr[end];
arr[end] = arr[start];
arr[start] = temp;
new KuaiSuSort().printSort(arr);
}
//从前开始,从前往后,将大的放在标记数key后面,如果比key小就跳过 end--
while(start < end && arr[start] <= key) {
start++;
}
//将大于key的放后面
if(arr[start] >= key) {
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
new KuaiSuSort().printSort(arr);
}
//递归调用
if(low < start) {
kuaiSuSort(arr , low,start-1);
new KuaiSuSort().printSort(arr);
}
if(end < high) {
kuaiSuSort(arr , end+1,high);
new KuaiSuSort().printSort(arr);
}
}
}
public static void main(String[] args) {
int []arr={12,20,5,16,15,1,2,100,30,45,23,9};
int low=0;
int high=arr.length-1;
System.out.println("排序前");
new KuaiSuSort().printSort(arr);
System.out.println("排序后");
new KuaiSuSort().kuaiSuSort(arr, low, high);
new KuaiSuSort().printSort(arr);
}
}
打印结果:
原文:https://www.cnblogs.com/lbj-bingo/p/14481273.html