快速排序
- 从待排序区间选择一个数,作为基准值(pivot);
- Partition: 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的
(可以包含相等的)放到基准值的右边; - 采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度 == 1,代表已经有序,或者小区
间的长度 == 0,代表没有数据。
可以进行画图 试走
// partition() 方法是 排序 一位值
public static int partition(int[] array,int low,int high) {
//先将最左边的元素给 temp
int temp = array[low];
//再开始从右边找 比 temp 小的 移到 low的位置
//再从左找 比 temp 大的 移到hight 的位置
//直到左右指针相遇,遍历完之后停止 ,
//将temp的值放回low/high的位置
while(low < high) {
while(low < high && array[high] > temp) {
high--;
}
array[low] = array[high];
while(low < high && array[low] < temp) {
low ++;
}
array[high] = array[low];
}
array[low] = temp;
return low;
}
public static void quickSort(int[] array,int low,int high)
{
//1. 先找到 第一个par
int par = partition(array,low,high);
// 再 向左 找,直到左边的都有序
if(par > low + 1) {
quickSort(array,low,par-1);
}
//再向右找
if(par < high - 1) {
quickSort(array,par+1,high);
}
}