/**
* 排序过程
* 1,找一个基准数,找数组内的任意一个数都行,一般都是以数组第一个数为基准数
* 2,从数组末位向前循环找比基准数小的,找到了先停下,也就是记录当前的索引
* 从数组开端向后循环找比基准数大的,找到了先停下,也就是记录当前的索引
* 3,将第二步的两个索引的位置的数值交换,这样比基准数大的就到了基准数的后面, 比基准数小的就到了基准数的前面
* 4,继续不停的重复2,3步,直到两个索引位置相等,就不用再交换了,也就是当start < end时就不停止循环
* 5,start和end相等,停止循环,将start或end位置的数与基准数交换
* 6,递归循环基准数左面的数组
* 7,递归循环基准数右面的数组
* @param arr
* @param start
* @param end
*
* 几个问题,(把索引start和end当成指针来讲)
* start和end一定会相遇吗,或者说start和end一定会相等吗?
* 答:一定会的,因为start和end都是一步一步移动的,移动会发生重合
* start和end相遇或者说重合或者说索引位置一样,该位置的数一定是比基准数小的吗?(该位置的数要和基准是交换)
* 答:因为是end先移动的,end指向的都是比比基准数小的数(start和end交换时)
* 1当end发现比基准数小的数,start发现比基准数大的数,进行交换数据时,一定是成对出现的
* 2当end往前移动与start相遇时,这个时候start和end已经交换了数据,start指向的就是比基准数小的数,
* 3当start向后移动,end已经指向的是比基准数小的数,
* 4综上;当相遇时start和end位置上的数一定是比基准数小的数,所以可以和首位置上的基准数交换
* 5出现“相遇时start和end位置上的数一定是比基准数小的数”这种情况是移动的先后顺序引起的,如果是start
* 先移动,则相遇时最后指向的是比基准数大的数。
*/
public static void fastSort(int[] arr,int start,int end){
if(null == arr || arr.length == 0 || start >= end)
return;
//将start 和 end记录下来,是为了进行左侧和右侧两段的排序
int left = start;
int right = end;
int key = arr[start];
while (start < end){
//从后往前循环,如果不是先从后往前循环,那么排序结果是不正确的,为什么?
while (start < end && arr[end] >= key) end--;
//从前往后循环
while (start < end && arr[start] <= key) start++;
if(start < end) swap(arr,start,end);
}
//将基准数和start与end相等的位置的数交换位置,left位置就是最开端的数,是基准数
//这个时候start和end是相等的,这里用end也可以
swap(arr,left,start);
//基准数左侧数组的排序
fastSort(arr,left,start-1);
//右侧的排序
fastSort(arr,start+1,right);
}
Hello World
输出:6,7,9,30,34,34,42,48,49,83,84,89,93,98,223,321,845,
public static void swap(int[] arr,int index1,int index2){
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
public static void main(String args[]){
System.out.println("Hello World");
int[] arr = {30,6,89,83,42,9,34,84,98,93,845,321,34,7,223,48,49};
fastSort(arr,0,arr.length-1);
// swap(arr,0,2);
printArr(arr);
}
private static void printArr(int[] arr) {
StringBuilder stringBuilder = new StringBuilder();
for (int i : arr) {
stringBuilder.append(i).append(",");
}
System.out.println(stringBuilder.toString());
}