快速排序的关键是:
1.先随机在数组中选择一个数字;
2.然后将数组的数字分为两部分。比该数字小的在左边,大的在右边。
3.对左右两部分重复1、2步骤
通过图像来理解就是:
image快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。(比如数组已经排好序了,而每一轮排序的时候都以最后一个数字作为基准)。因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。
Partition函数是快速排序的核心,用来实现步骤1、2。
public class Solution {
public static int Partition(int[] array, int start, int end) {
Random rand = new Random();
int index = rand.nextInt(end - start + 1) + start;
Swap(array, index, end);
int small = start - 1;
for(index = start; index < end; index++) {
if(array[index] < array[end]) {
small++;
if(small != index)
Swap(array, small, index);
}
}
small++;
Swap(array, small, end);
return small;
}
public static void QuickSort(int[] array, int start, int end) {
if(start == end)
return;
int index = Solution.Partition(array, start, end);
if(index > start)
QuickSort(array, start, index - 1);
if(index < end)
QuickSort(array, index + 1, end);
}
}
网友评论