快速排序
思想(个人理解):
1、定义一个基准元素,一般使用第一个元素的值作为基准
2、 再定义两个坐标,low和heigh,分别指向第一个元素和最后一个元素
3.1、 将指向heigh的元素和这个基准元素比较,如果比基准大,则位置不变,heigh 进行-1
3.2、 如果比基准元素小,则将指向heigh的元素赋值给指向low的元素
4.1、 再将指向low的元素与基准元素进行比较,如果比基准小,位置不变,low进行+1
4.2、 如果比基准元素大,则把指向low的元素赋值给指向heigh的元素
5、 知道low 和 heigh相等 两个坐标都指向同一个元素,再将基准赋值给这个元素,将要排序的所有元素分成
两个部分, 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
6、然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
public class QuickSort {
public static void main(String[] args) {
int[] array = new int[]{3,1,8,34,93,1,35,34,7,9,6,5};
System.out.println(Arrays.toString(array));
quickSort(array,0,array.length-1);
System.out.println(Arrays.toString(array));
}
static void quickSort(int[] array, int begin, int end) {
if (begin < end) {
// 将第1个元素作为基准
int target = array[begin];
// 定义两个坐标
int low = begin;
int heigh = end;
while (low < heigh) {
//当基准数比右边数小时
while (low < heigh && target <= array[heigh]) {
heigh--;
}
//当基准数大于右边数,将右边数直接赋值给左边数
array[low] = array[heigh];
//当左边数比基准数小时
while (low < heigh && array[low] <= target) {
low++;
}
//当左边数大于基准数时,将左边数赋值给基准数
array[heigh] = array[low];
}
//将基准数放回数组中
array[low] = target;
//基准数把数组分成两份,再将这两份分别进行递归
quickSort(array, begin, low);
quickSort(array, low + 1, end);
}
}
}