码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 交换排序(冒泡排序、快速排序)


    交换排序


    文章目录

    • 交换排序
      • 1. 冒泡排序
      • 2. 快速排序
      • 3. 例


    1. 冒泡排序

    • 时间复杂度O(n2)
    • 空间复杂度O(1)
    • 稳定
    • 适用:顺序存储和链式存储的线性表

    n个元素,n-1趟排序,每趟把最大的排到最后。

    int i, j;
    int flag;
    for (i = 0; i < n - 1; i++) {
        flag = 0
        for (j = 0; j < n - 1 - i; j++) {
            if (L[j] > L[j + 1]) {
                int tmp = L[j];
                L[j] = L[j + 1];
                L[j + 1] = tmp;
                flag = 1;
            } 
        }
        if (!flag) break; 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2. 快速排序

    • 时间复杂度O(nlog2n),最坏会退化为O(n2)
    • 空间复杂度最好O(log2n),最坏O(n)
    • 不稳定
    • 适用:顺序存储的线性表

    基于分治,每次排序将确定一个枢轴(基准)pivot

    然后将表通过枢轴一分为二,保证左边均小于pivot,右边均大于pivot。

    此举将保证pivot已经落在了最终序列的相应位置。

    运用递归的思想,将子表重新快速排序。

    void quick_sort(ElemType L[], int l, int r) {
        if (l < r) {
        	int cut = partition(L, l, r);
        	quick_sort(L, l, cut - 1);
        	quick_sort(L, cut + 1, r);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    快速排序好坏的关键取决于划分算法partition,写法根据枢轴的选择而不同

    int partition(ElemType L[], int l, int r) {
        ElemType cut = L[l]; 	// 选取最左边元素为枢轴(可不同)
        while (l < r) {
            while (l < r && L[r] >= cut) --r;
            L[l] = L[r];
            while (l < r && L[l] <= cut) ++l;
            L[r] = L[l];
        }
        L[l] = cut;
        return l;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3. 例

    LeetCode 912. 排序数组

    // 交换排序
    int* sortArray(int* nums, int numsSize, int* returnSize)
    {
        *returnSize = numsSize;
        int i, j;
        int flag;
        for (i = 0; i < numsSize - 1; i++) {
            flag = 0;
            for (j = 0; j < numsSize - 1 - i; j++) {
                if (nums[j] > nums[j + 1]) {
                    int tmp = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = tmp;
                    flag = 1;
                }
            }
            if (!flag) return nums;
        }
        return nums;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    // 快速排序
    int partition(int* L, int l, int r) 
    {
        int cut = L[l]; 	// 选取最左边元素为枢轴(可不同)
        while (l < r) {
            while (l < r && L[r] >= cut) --r;
            L[l] = L[r];
            while (l < r && L[l] <= cut) ++l;
            L[r] = L[l];
        }
        L[l] = cut;
        return l;
    }
    
    void quick_sort(int* L, int l, int r) 
    {
        if (l < r) {
        	int cut = partition(L, l, r);
        	quick_sort(L, l, cut - 1);
        	quick_sort(L, cut + 1, r);
        }
    }
    
    int* sortArray(int* nums, int numsSize, int* returnSize)
    {
        *returnSize = numsSize;
        quick_sort(nums, 0, numsSize - 1);
        return nums;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
  • 相关阅读:
    集合—LinkedList底层结构
    【 数据分析概述与职业操守】——CDA level1
    GGTalk 开源即时通讯系统源码剖析之:虚拟数据库
    你是几星测试/开发程序员?技术型选手王大拿......
    YOLO目标检测——复杂场景人员数据集【含对应voc、coco和yolo三种格式标签】
    M3 MacBook Pro 能提效?程序员、产品经理自证后,CTO:你赢了,新电脑在路上了...
    Pandas to_sql 函数避坑指南「mssql字符乱码」
    深浅拷贝的区别?如何实现一个深拷贝?
    Java基础(五)
    webAPI学习大纲整理(一)
  • 原文地址:https://blog.csdn.net/Formy7/article/details/126182011
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号