介绍
快速排序(Quicksort)是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
实现原理
1.任意找数组中的一个数字作为参照数,用这个数做分界值。
/**
* 分区移动方法
* @param arr
* @param low
* @param high
*/
private static int partition(int[] arr, int low, int high) {
int pivot = arr[low]; // 参照数字默认为数组的第一个元素。
int left = low; // 左指针指向最左侧。
int right = high - 1; // 右指针指向最右侧。
while (left < right) {
// 若右指针大于基准值,则左移。
while (left < right && arr[right] >= pivot) {
right--;
}
arr[left] = arr[right];
// 若左指针小于基准值,则右移。
while (left < right && arr[left] <= pivot) {
left++;
}
arr[right] = arr[left];
}
//这里注意当左边和右边的指针移动第一次同时碰头的时候,说明没有搜寻到比基准数大或者小的值,这个位置就是基准数排序中的正确位置
arr[left] = pivot;
// 把每一趟排序的结果也输出一下。
print(arr);
// 返回基准值的索引。
return left;
}
2.对该数组从第一位和最后一位数字面对面向中间搜索
3.末尾的搜索先出发,每搜索一个数字和参照数进行比较。如果大于参照数,则右指针向左移。如果小于参照数,则右指针指向的数和此时左指针指向的数交换位置。
4.第一次左右两个指针同时指向一个数时,说明该数为参照数的正确位置,将该数与参照数交换位置。
5.参照数被放在正确的排序位置后,此时数组相当于被分为两个子数组。然后使用递归调用上面的比较方法,
private static void quickSort(int[] arr,int low,int high) {
// 只有一个元素的话,则什么都不做。
if (high - low <= 1) return;
// 分区。
int partition = partition(arr, low, high);
// 递归左右两个分区。
quickSort(arr, low, partition);
quickSort(arr, partition + 1, high);
}
6.个人觉得快速排序就是把数组中的数字进行跳跃性交换(效率高),然后找到参照数的正确位置,每一个排序的数字都可以看成是一个参照数,知道最后分出来的子数组长度为1时返回。
public static void quickSort(int[] arr) {
if (arr == null || arr.length <= 1)
return;
quickSort(arr,0,arr.length);
}
打印数组
// 打印数组
public static void print(int[] arr) {
if (arr == null) return;
for(int i : arr) {
System.out.print(i + " ");
}
System.out.println();
}
说了这么多,我表述可能也不是太清晰,直接上代码吧,不懂的最好方法就是拿起你手中的代码开始敲,多写两遍基本就懂了
测试
public static void main(String[] args) {
int[] arr= {6 ,1, 2, 7 ,9, 3, 4, 5, 10, 8};
System.out.print("排序前");
print(arr);
System.out.println("--------------");
quickSort(arr);
System.out.print("排序后");
print(arr);
}
**
前跨一步,可能会发现一条意外的小路。生活如山路,向前跨一步,便可发现一条更好的路,使生活更充实,更有乐趣。—— 松下幸之助
**