1. 快排理解--------“挖坑+填坑”+分治策略:
对于一个需要进行快排的数组arr[n],可以将其视为n块连续的地板,分别用left、right指向第1块和第n块地板,设pivot为基
准,pivot=arr[left]。 i=left, j=right;当(i<j)时,pivot=arr[left]表示挖掉了第(i+1)块地板(数组下标从0开始,故加1);然后从第j块
地板开始向前遍历,如果arr[j]>pivot,则j--;当arr[j]<=pivot时,将该地板挖掉,并且填补到上述左边被挖掉的坑里, 即arr[i]。
如此循环,最后循环结束时,有i==j,此时arr[i]所代表的地板已被挖掉,所以将基准pivot填补到该处,第一次排序结束。
且快排满足分治策略---------当每个分区中均值存在一个元素时。可分为2个子问题,即左边部分和右边部分,最后利用递归得出结果。
2.算法思想:
a. 找基准pivot,可以是任意一个元素,本文默认pivot为数组第一个元素;
b. “挖坑+填坑”,将大于pivot的元素放置右边,小于pivot的元素放置左边;
c. 再对左右两个分区分别执行b步骤,直至每个分区中均只存在一个元素。
3. 时间复杂度:
最差时间复杂度: O(n^2)
最有时间复杂度: O(nlogn)
平均时间复杂度: O(nlogn)
最差时间复杂度: 格局实现的方式不同而不同
4. 源代码:
public class QukSort {
public static void main(String[] args) {
int[] arr = { 9, -4, 0, 32, 22, 100, -55, -32, 21, 54, 88, 77, 555, 43, -666 };
quickSort(arr, 0, arr.length - 1); // 快速排序
System.out.println("快速排序后:");
for (int k = 0; k < arr.length; k++) {
System.out.print(arr[k] + " ");
}
System.out.println();
}
private static void quickSort(int[] arr, int left, int right) {
int i = left;
int j = right;
int pivot = arr[left]; // pivot作为基准数
while (i < j) {
while (i < j && arr[j] > pivot) {
j--;
}
if (i < j) {
arr[i] = arr[j];
i++; // 减少一次比较
}
while (i < j && arr[i] < pivot) {
i++;
}
if (i < j) {
arr[j] = arr[i];
j--; // 减少一次比较
}
}
arr[i] = pivot;
if(left
当然,若在java语言中使用快排时,由于封装好的缘故,直接调用即可-------Arrays.sort();