图解十大排序五---快速排序

图解十大排序

快速排序

今日我们来介绍我们所要讲的第三种时间复杂度为 O(nlog2 n)的排序方法,它就是快速排序,同冒泡排序一样,快速排序也属于交换排序,通 过元素之间的比较和交换位置来达到排序的目的。 不同的是,冒泡排序在每一轮中只把1个元素冒泡 到数列的一端,而快速排序则在每一轮挑选一个 元素,并让其他比它大的元素移动到数列一边,比它 小的元素移动到数列的另一边,从而把数列拆解成两 个部分

通俗点来说 :通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

让我们来看一个例子: 给定无序数组 : [6, 5, 2, 3, 4, 8, 7, 9]
在这里插入图片描述

我们一般挑选最左边或最右边的元素作为基准,本例中我们取6为基准,并且设置两个指针 lr,分指向数组第一个元素左边和最后一个元素的右边。

在这里插入图片描述

第一轮 : l指针向右移动, 6 不小于基准元素,l指针在该位置停下,紧接着r指针向左移动,移到4的位置发现 4<基准元素,到此让l和r指针所指向的元素进行交换

在这里插入图片描述

在这里插入图片描述

第二轮 :l 继续向右移,直到不比基准元素小的位置停下,碰巧的是基准元素之前的元素都比它小,所以指针l在6的位置停下,指针lr相遇,至此,第一次循环结束,在基准元素之前的元素都小,在基准元素后的元素都大于它(这里大家可能会想到相等的情况呢,相等的时候在左边或者右边没有关系)

在这里插入图片描述

接下来就是分别将基准元素的左右俩侧重新进行如上的快速排序,我们就不在阐述啦
在这里插入图片描述

!

快速排序代码实现

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)

下篇预告:图解十大排序篇六 堆排序

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值