经典算法之快速排序法(附B站最细讲解视频)

活动地址:21天学习挑战赛

 

文章目录

 一、算法

1.算法概述

2.算法步骤

3.算法特点

二、算法实践

1.Java代码

2.执行结果

3.讲解视频 

三、复杂度分析

1.时间复杂度

2.空间复杂度


 一、算法

1.算法概述

快速排序(Quick Sort)是由冒泡排序改进而成的。在冒泡排序中,每次只对相邻的两个记录进行比较,因此每一次交换相邻记录时只能一次消除一个逆序;而快速排序则是对这一缺点进行改进,它通过交换两个(不相邻)的记录来消除多个逆序,从而大大加快了排序的速度,提升了排序的性能。

文章传送门 :经典算法之冒泡排序与直接选择排序

2.算法步骤

  • 在待排序的n个记录中任取一个记录(通常取第一个元素)作为枢轴,设其关键字为key
  • 经过一趟排序后,把所有关键字小于key的记录交换放到key前面,把所有关键字记录大于key的记录交换放到key后面,结果将待排序的记录分成了两个子表,最后将枢轴key放到分界处的位置
  • 然后,分别对上面的左、右两个子表重复上述的过程,直至每一个子表只有一个元素时,则排序完成

其中一趟快速排序的具体步骤如下:

  1. 选择待排序表中的第一个记录作为枢轴, 将枢轴记录暂存在r[0]的位置上。附设两个指针low和high,初始时分别指向表的下界和上界(第一趟时,low= 1; high = L.length; )。
  2. 从表的最右侧位置依次向左搜索,找到第一个关键字小于枢轴关键字key的记录,将其移到low处。具体操作是:当low<high时,若high所指记录的关键字大于等于key,则向左移动指针high (执行操作--high);否则将high所指记录移到low所指记录。
  3. 再从表的最左侧位置,依次向右搜索找到第-一个关键字大于key的记录和枢轴记
    录交换。具体操作是:当low<high时,若low所指记录的关键字小于等于key,则向右移动
    指针low (执行操作++low );否则将low所指记录与枢轴记录交换。
  4. 复步骤2和3,直至low与high相等为止。此时low或high的位置即为枢轴在此趟排
    序中的最终位置,原表被分成两个子表

在上述过程中,记录的交换都是与枢轴之间发生,每次交换都要移动3次记录,可以先将枢
轴记录暂存在r[0]的位置上,排序过程中只移动要与枢轴交换的记录,即只做r[low]或r[high]的
单向移动,直至一趟排序结束后再将枢轴记录移至正确位置上。
 

3.算法特点

  • 由于记录是非顺次移动导致快速排序是不稳定排序
  • 排序过程中需要定位表的下界和上界,所以适用于顺序结构,很少用于链式结构
  • 当n较大时,在平均情况下快速排序是所有内部排序中速度最快的一种
  • 故其适用于初始记录无序、n较大的情况


二、算法实践

1.Java代码

package TwentyOne_Challenge;

public class DayEight{
    public static void main(String[] args) {
        int a[]={7,13,6,50,25,78,11,100};
        System.out.println("原来无序序列为:");
        for (int i = 0; i < a.length ; i++) {
            System.out.print(a[i]+" ");
        }
        System.out.println();
        System.out.println("经快速排序后:");
        //快速排序法
        quickSort(a);
        for (int i = 0; i < a.length ; i++) {
            System.out.print(a[i]+" ");
        }
    }
    private static void quickSort(int[] array) {
        quickSortFunc(array, 0, array.length-1);
    }
    private static void quickSortFunc(int[] array, int start, int end) {
        if (start >= end) return;
        //找基准值的下标
        int keyIndex = findKey(array, start, end);
        //对左子序列进行递归快速排序
        quickSortFunc(array, start, keyIndex-1);
        //对右子序列进行递归快速排序
        quickSortFunc(array, keyIndex+1, end);
    }
    private static int findKey(int[] array, int left, int right) {
        //取左边界元素为基准值,该位置“挖坑”
        int key = array[left];
        int start = left;
        int end = right;
        while (start < end) {
            //从右往左扫描,寻找比key小的记录
            while (start < end && array[end] >= key) {
                end--;
            }
            array[start] = array[end];
            //从左往右扫描,寻找比key大的记录
            while (start < end && array[start] <= key) {
                start++;
            }
            array[end] = array[start];
        }
        //start与end相等时的位置,即到达基准值位置
        array[start] = key;
        //返回基准值的下标
        return start;
    }
}

2.执行结果

3.讲解视频 

快速排序算法

 (注:视频来源于B站up主:codereasy) 


三、复杂度分析

注:以下图片来自于教材《数据结构(C语言版)》——严蔚敏 李冬梅 吴伟民 编著

1.时间复杂度

2.空间复杂度

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顾老师不懂代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值