图解十大排序
快速排序
今日我们来介绍我们所要讲的第三种时间复杂度为 O(nlog2 n)的排序方法,它就是快速排序,同冒泡排序一样,快速排序也属于交换排序,通 过元素之间的比较和交换位置来达到排序的目的。 不同的是,冒泡排序在每一轮中只把1个元素冒泡 到数列的一端,而快速排序则在每一轮挑选一个 元素,并让其他比它大的元素移动到数列一边,比它 小的元素移动到数列的另一边,从而把数列拆解成两 个部分。
通俗点来说 :通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
让我们来看一个例子: 给定无序数组 : [6, 5, 2, 3, 4, 8, 7, 9]
我们一般挑选最左边或最右边的元素作为基准,本例中我们取6为基准,并且设置两个指针 l
和r
,分指向数组第一个元素左边和最后一个元素的右边。
第一轮 : l
指针向右移动, 6 不小于基准元素,l
指针在该位置停下,紧接着r
指针向左移动,移到4的位置发现 4<基准元素,到此让l和r指针所指向的元素进行交换。
第二轮 :l
继续向右移,直到不比基准元素小的位置停下,碰巧的是基准元素之前的元素都比它小,所以指针l
在6的位置停下,指针l
和r
相遇,至此,第一次循环结束,在基准元素之前的元素都小,在基准元素后的元素都大于它(这里大家可能会想到相等的情况呢,相等的时候在左边或者右边没有关系)
接下来就是分别将基准元素的左右俩侧重新进行如上的快速排序,我们就不在阐述啦
!
快速排序代码实现
public static void quickSort(int[] q, int l, int r) {
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l ];
while (i < j)
{
do i ++ ; while (q[i] < x);
do j -- ; while (q[j] > x);
if (i < j) {
int t = q[i];
q[i] = q[j];
q[j] = t;
}
}
quickSort(q, l, j);
quickSort(q, j + 1, r);
}
public static void main(String[] args) {
int [] array = {6, 5, 2, 3, 4, 8, 7, 9};
quickSort(array, 0, array.length - 1);
System.out.println(Arrays.toString(array));
}
算法分析
- 最佳情况:T(n) = O(nlogn)
- 最差情况:T(n) = O(n2)
- 平均情况:T(n) = O(nlogn)
下篇预告:图解十大排序篇六 堆排序