目录
1.快速排序
1.任取待排序元素序列中的某元素作为基准值
2.按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值
3.然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。
1.1 基本框架
下面是快速排序的一个基本框架
public class sort{
public static void quickSort(int[] array){
quick(array,0,array.length-1);
}
public static void quick(int[] array, int start, int end){
if (start >= end){
//为什么是大于等于:
// 当基准值左边没有元素的时候,start的值是大于end的 1234
// 当基准值右边没有元素的时候,start的值是大于end的 1234
return;
}
//划分,找出基准值
int pivot = partition(array,start,end);
quick(array,start,pivot-1);
quick(array,pivot+1,end);
}
public static int partition(int[] array, int left, int right){
//返回基准值下标
return -1;
}
}
重点是如何找到这个基准值
1.2 挖坑法
1.2.1 思路
1.定义待排序序列的起始位置为left,末尾位置为right
2.定义tmp=array[left]的值 ,left记录的是排序小于基准值的最后一位
3.从右边开始找小于tmp的值,找不到就 往前面移动。找到之后此时的left下标的值就等于right下标的值
4.从左边开始找大于tmp的值,找不到就 往后面移动。找到之后此时的right下标的值就等于left下标的值
5.最后直到right和left相遇,将tmp的值放在left下标上。
6.最后返回left为基准值下标
1.2.2 代码实现
public class sort{
private static int partition1(int[] array,int left, int right){
int tmp = array[left];
while (left < right){
while (left < right && array[right] >= tmp){
// 1.1 left < right 防止越界
// 1.2 array[right] >= tmp 可不可以不加等号?
// 不可以,假设不加等号,right一开始就等于tmp,不会进入循环,
// 进行左右值进行就交换,
// 也不会进入下面的循环,在进行左右值进行交换,再就交换回来了,就会进入死循环
right--;
}
// array[right] < tmp 此时交换左右的值
array[left] = array[right];
while (left < right && array[left] <= tmp){
left++;
}
//array[left] > tmp
array[right] = array[left];
}
//left和right相遇 left == right
array[left] = tmp;
return left;
}
}