快速排序实现
package demo4;
import java.util.Arrays;
/**
* 快速排序
* 选择一个基数作为比较的标准,比它大的都在右边,比它小的都在左边
*/
public class QuickSort {
public static void main(String[] args) {
int[] arr = new int[]{3,2,5,7,1,4,9,8,6};
quickSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
/**
* 3,2,5,7,1,4,9,8,6
* 以3为基数
* 一开始比较用low标记3的下标,high标记6的下标。 3和6 ,3比6小,不替换,high下标移动指向8的下标,然后比较3和8,
* 一直这样比较下去直到,直到3和1比较,此时3大于1,high指向的是1,然后high停住不动,替换,把1的值暂时覆盖3的值,然后第一的值是1,high的值也为1,把值3赋值在一个临时变量中
* (注意是替换不是交换,3不会消失,因为它赋值给了st)
* 3, 2, 5, 7, 1, 4, 9, 8, 6
* low high
*然后Low开始移动,arr[low]与临时变量3开始比较,直到有比3大的值停下
* 1, 2, 5, 7, 1, 4, 9, 8, 6
* low high
* 此时low的位置是5,5比3大。则把5替换掉high位置的1,此时low不动,让high移动
* 1, 2, 5, 7, 5, 4, 9, 8, 6
* low high
* 直到low=high,然后把这个位置数(5)替换成基数(3)第一次循环结束 ,此时左边都比基数(3)小,右边都比基数(3)大
* 1, 2, 3, 7, 5, 4, 9, 8, 6
* low
* high
* 通过3分割为两部分
* 1, 2, 3
* 7, 5, 4, 9, 8, 6
* 然后按照上面的比较方式在进行比较,直到只剩下一个数无法再分割,表示排序结束,实现方式采用递归
* @param arr
* @param start
* @param end
*/
public static void quickSort(int[] arr,int start,int end){
if(start<end){//递归结束条件
//把数组中的第0个数字作为基数
int st=arr[start];
//记录需要排序的下标,最开始是第一个和最后一个
int low = start;
int high = end;
//循环找出比标准数大的数和小的数
while (low<high){//循环结束的条件,不能用low<=high,不然会多执行一次
//如果基数小于等于要比较的数(右边的数),则不替换,但是high的下标要向下移一位,直到不满足条件执行下面的替换
while (low<high&&st<=arr[high]){
high--;
}
//替换位置,此时high下标停住不动
arr[low]=arr[high];
//如果左边的数字比标准数小,则low下标向前移动,直到不满足条件执行下面的替换
while (low<high&&arr[low]<=st){
low++;
}
//替换位置,此时low下标停住不动。等待下一次循环,直到high等于low循环结束
arr[high]=arr[low];
}
//把基数赋值给位置重合的位置的数
arr[low]=st;//arr[high]=st也一样。
//处理左边小的数,直到不能分割,递归结束
quickSort(arr,start,low);
//处理右边大的数,直到不能分割,递归结束
quickSort(arr,high+1,end);
}
}
}