C/C++算法从小白到高手(1):排序算法

这篇具有很好参考价值的文章主要介绍了C/C++算法从小白到高手(1):排序算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 冒泡排序

(1) 基本思路

冒泡排序是一种简单的、但效率极低的排序算法,基本思路是重复地遍历待排序的序列,通过相邻元素的比较和交换,将较大(或较小)的元素逐步"冒泡"到右侧(或左侧),直到整个序列有序为止。

(2) 升序排序
BUBBLE-SORT(a, len)
    for i = 1 ~ len-2
    do
        for j = 1 ~ len-i-2
        do
            if a[j] > a[j+1]
            do
                swap(a[j], a[j+1]);
            end if
        end for
    end for
(3) 分析时间复杂度
程序 执行次数(化简后) 时间复杂度
for i = 1 ~ len-2 l e n − 2 len-2 len2 O ( l e n ) O(len) O(len)
for j = 1 ~ len-i-2 ( l e n − 1 ) ⋅ ( l e n − 2 ) 2 \frac{{(len-1) \cdot (len-2)}}{2} 2(len1)(len2) O ( l e n 2 ) O(len^2) O(len2)
if a[j] > a[j+1] ( l e n − 1 ) ⋅ ( l e n − 2 ) 2 \frac{{(len-1) \cdot (len-2)}}{2} 2(len1)(len2) O ( l e n 2 ) O(len^2) O(len2)
swap(a[j], a[j+1]) ( l e n − 1 ) ⋅ ( l e n − 2 ) 2 \frac{{(len-1) \cdot (len-2)}}{2} 2(len1)(len2) O ( l e n 2 ) O(len^2) O(len2)
BUBBLE-SORT 3 l e n 2 − 9 l e n + 10 2 ⋅ ( l e n − 2 ) \frac{{3len^2 - 9len + 10}}{2} \cdot (len-2) 23len29len+10(len2) O ( l e n 3 ) O(len^3) O(len3)

所以,冒泡排序的时间复杂度一般在 O ( n 3 ) O(n^3) O(n3) 上下。即使时间复杂度很高,但是冒泡排序还是有很高的地位。它既简单,又容易实现。

2. 插入排序

(1) 基本思路

插入排序是一种简单直观的排序算法,基本思路是将一个待排序的元素插入到已经排好序的子序列中的适当位置,直到整个序列有序为止。

(2) 升序排序
INSERTION-SORT(a, len)
    for i = 1 ~ len-1
    do
        key = a[i]
        j = i - 1
        while j >= 0 and a[j] > key
        do
            a[j+1] = a[j]
            j = j - 1
        end while
        a[j+1] = key
    end for
(3) 分析时间复杂度
程序 执行次数(化简后) 时间复杂度
for i = 1 ~ len-1 l e n − 1 len-1 len1 O ( l e n ) O(len) O(len)
while j >= 0 and a[j] > key ( l e n − 1 ) ⋅ ( l e n − 2 ) 2 \frac{{(len-1) \cdot (len-2)}}{2} 2(len1)(len2) O ( l e n 2 ) O(len^2) O(len2)
a[j+1] = a[j] ( l e n − 1 ) ⋅ ( l e n − 2 ) 2 \frac{{(len-1) \cdot (len-2)}}{2} 2(len1)(len2) O ( l e n 2 ) O(len^2) O(len2)
a[j+1] = key l e n − 1 len-1 len1 O ( l e n ) O(len) O(len)
INSERTION-SORT 3 l e n 2 − 3 l e n + 4 2 \frac{{3len^2 - 3len + 4}}{2} 23len23len+4 O ( l e n 2 ) O(len^2) O(len2)

所以,插入排序的时间复杂度一般在 O ( n 2 ) O(n^2) O(n2) 上下。它的时间复杂度比冒泡排序低,是一种简单且常用的排序算法。

3. 选择排序

(1) 基本思路

选择排序是一种简单直观的排序算法,基本思路是找到待排序序列中的最小(或最大)元素,将它与序列的第一个位置进行交换,然后再在剩余的序列中找到最小(或最大)元素,将它与序列的第二个位置进行交换,以此类推,直到整个序列有序为止。

(2) 升序排序
SELECTION-SORT(a, len)
    for i = 1 ~ len-1
    do
        minIndex = i
        for j = i+1 ~ len
        do
            if a[j] < a[minIndex]
            do
                minIndex = j
            end if
        end for
        swap(a[i], a[minIndex])
    end for
(3) 分析时间复杂度
程序 执行次数(化简后) 时间复杂度
for i = 1 ~ len-1 l e n − 1 len-1 len1 O ( l e n ) O(len) O(len)
for j = i+1 ~ len ( l e n − 1 ) ⋅ l e n 2 \frac{{(len-1) \cdot len}}{2} 2(len1)len O ( l e n 2 ) O(len^2) O(len2)
if a[j] < a[minIndex] ( l e n − 1 ) ⋅ l e n 2 \frac{{(len-1) \cdot len}}{2} 2(len1)len O ( l e n 2 ) O(len^2) O(len2)
swap(a[i], a[minIndex]) l e n − 1 len-1 len1 O ( l e n ) O(len) O(len)
SELECTION-SORT 3 l e n 2 − 3 l e n + 4 2 \frac{{3len^2 - 3len + 4}}{2} 23len23len+4 O ( l e n 2 ) O(len^2) O(len2)

所以,选择排序的时间复杂度一般在 O ( n 2 ) O(n^2) O(n2) 上下。虽然时间复杂度较高,但选择排序在某些情况下可以比其他排序算法更高效。

4. 快速排序

(1) 基本思路

快速排序是一种高效的排序算法,基本思路是通过一趟排序将待排序序列分割成独立的两个部分,其中一部分的所有元素都比另一部分的任意元素小,然后再对这两部分继续进行排序,直到整个序列有序为止。

(2) 升序排序
QUICK-SORT(a, low, high)
    if low < high
    do
        pivotIndex = PARTITION(a, low, high)
        QUICK-SORT(a, low, pivotIndex-1)
        QUICK-SORT(a, pivotIndex+1, high)
    end if

PARTITION(a, low, high)
    pivotValue = a[high]
    i = low - 1
    for j = low ~ high-1
    do
        if a[j] <= pivotValue
        do
            i = i + 1
            swap(a[i], a[j])
        end if
    end for
    swap(a[i+1], a[high])
    return i + 1
(3) 分析时间复杂度
程序 执行次数(化简后) 时间复杂度
if low < high log ⁡ 2 ( l e n ) \log_2(len) log2(len) O ( log ⁡ ( l e n ) ) O(\log(len)) O(log(len))
PARTITION(a, low, high) l e n − 1 len-1 len1 O ( l e n ) O(len) O(len)
QUICK-SORT(a, low, pivotIndex-1) l e n 2 − l e n 2 \frac{{len^2 - len}}{2} 2len2len O ( l e n 2 ) O(len^2) O(len2)
QUICK-SORT(a, pivotIndex+1, high) l e n 2 − l e n 2 \frac{{len^2 - len}}{2} 2len2len O ( l e n 2 ) O(len^2) O(len2)
QUICK-SORT 3 l e n 2 − 3 l e n + 10 2 \frac{{3len^2 - 3len + 10}}{2} 23len23len+10 O ( l e n 2 ) O(len^2) O(len2)
PARTITION l e n − 1 len-1 len1 O ( l e n ) O(len) O(len)

所以,快速排序的时间复杂度一般在 O ( n 2 ) O(n^2) O(n2) 上下,但在平均情况下,时间复杂度为 O ( n log ⁡ n ) O(n \log n) O(nlogn)

5. 归并排序

(1) 基本思路

归并排序是一种高效的排序算法,基本思路是将待排序序列分成若干个子序列,分别进行排序,然后再将已排序的子序列合并成更大的有序序列,直到最终只有一个有序序列为止。

(2) 升序排序
MERGE-SORT(a, low, high)
    if low < high
    do
        mid = (low + high) / 2
        MERGE-SORT(a, low, mid)
        MERGE-SORT(a, mid+1, high)
        MERGE(a, low, mid, high)
    end if

MERGE(a, low, mid, high)
    n1 = mid - low + 1
    n2 = high - mid
    left = new Array[n1]
    right = new Array[n2]
    for i = 0 ~ n1-1
    do
        left[i] = a[low + i]
    end for
    for j = 0 ~ n2-1
    do
        right[j] = a[mid + 1 + j]
    end for
    i = 0
    j = 0
    k = low
    while i < n1 and j < n2
    do
        if left[i] <= right[j]
        do
            a[k] = left[i]
            i = i + 1
        else
            a[k] = right[j]
            j = j + 1
        end if
        k = k + 1
    end while
    while i < n1
    do
        a[k] = left[i]
        i = i + 1
        k = k + 1
    end while
    while j < n2
    do
        a[k] = right[j]
        j = j + 1
        k = k + 1
    end while
(3) 分析时间复杂度
程序 执行次数(化简后) 时间复杂度
if low < high log ⁡ 2 ( l e n ) \log_2(len) log2(len) O ( log ⁡ ( l e n ) ) O(\log(len)) O(log(len))
MERGE-SORT(a, low, mid) l e n ⋅ ( log ⁡ ( l e n ) − 1 ) 2 \frac{{len \cdot (\log(len) - 1)}}{2} 2len(log(len)1) O ( l e n log ⁡ ( l e n ) ) O(len \log(len)) O(lenlog(len))
MERGE-SORT(a, mid+1, high) l e n ⋅ ( log ⁡ ( l e n ) − 1 ) 2 \frac{{len \cdot (\log(len) - 1)}}{2} 2len(log(len)1) O ( l e n log ⁡ ( l e n ) ) O(len \log(len)) O(lenlog(len))
MERGE(a, low, mid, high) l e n − 1 len-1 len1 O ( l e n ) O(len) O(len)
MERGE-SORT 3 l e n ⋅ ( log ⁡ ( l e n ) − 1 ) 2 \frac{{3len \cdot (\log(len) - 1)}}{2} 23len(log(len)1) O ( l e n log ⁡ ( l e n ) ) O(len \log(len)) O(lenlog(len))
MERGE l e n − 1 len-1 len1 O ( l e n ) O(len) O(len)

所以,归并排序的时间复杂度一般为 O ( n log ⁡ n ) O(n \log n) O(nlogn),在任何情况下都具有稳定的性能。文章来源地址https://www.toymoban.com/news/detail-800669.html

到了这里,关于C/C++算法从小白到高手(1):排序算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 排序算法——基数排序(C语言)

    什么是基数排序???基数排序是一种和快排、归并、希尔等等不一样的排序...它不需要比较和移动就可以完成整型的排序。它是时间复杂度是O(K*N),空间复杂度是O(K+M ) 基数排序是一种借助多的思想对单逻辑进行排序的方法。 基数排序根据每个位来分配

    2024年02月13日
    浏览(25)
  • 【排序算法】插入排序(C语言)

    【排序算法】—— 插入排序 ​ 直接插入排序是一种简单的插入排序法,对数组进行一个遍历,每次都对待排的数据按照大小顺序插入到一个有序数组中的特定位置,直到所有的数据全部插入完毕,就得到一个有序数列。 ​ 插入排序的算法非常简单,依次对每一个元素进行

    2024年01月23日
    浏览(28)
  • 【排序算法】冒泡排序(C语言)

    【排序算法】—— 冒泡排序 ​ 冒泡排序法:(Bubble sort)是一种基础的交换排序,非常简单,一学就懂 ​ 对数组进行遍历,每次对相邻两个进行比较大小,若大的数值在前面则交换位置(升序),完成一趟遍历后数组中最大的数值到了数组的末尾位置,再对前面n-1个数值进

    2024年02月06日
    浏览(47)
  • 【排序算法】快速排序(C语言)

    【排序算法】—— 快速排序 ​ 快速排序的单趟排序是以一个数作为基准值,实现将数组中比基准数小的数放在基准值的左侧,比基准值大的数放在基准值的右侧。 ​ 我们共有3种实现方法。 ​ 霍尔是最初发现快速排序的人,它使用的单趟排序算法被称为霍尔法。 ​ 用ke

    2024年02月16日
    浏览(33)
  • 【排序算法】归并排序(C语言)

    【排序算法】—— 归并排序(C语言) 归并排序(MergeSort) 是建立在归并操作上的一种有效的排序算法,采用分治法排序,分为 分解 、 合并 两个步骤。 分解 :将数组分割成两个数组,再分别将两个数组又细分成2个数组,直到,最后每个数组都是一个元素,这时将该单元

    2024年02月08日
    浏览(24)
  • 【C语言】解析C语言实现排序的算法(冒泡排序、插入排序、选择排序、快速排序、归并排序)

    本博客主要围绕五种常见的排序算法展开讨论,包括选择排序、快速排序、归并排序、冒泡排序和插入排序。针对每种算法,我对其思想、特点、时间复杂度、稳定性以及优缺点进行了详细解释和比较。 冒泡排序算法是一种简单且常用的排序算法。它通过重复地交换相邻的元

    2024年02月13日
    浏览(32)
  • 排序算法-选择/堆排序(C语言)

    每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的 数据元素排完 。 在元素集合 array[i]--array[n-1] 中选择关键码最大 ( 小 ) 的数据元素。 若它不是这组元素中的最后一个 ( 第一个 ) 元素,则将它与这组元素中的最后一个

    2024年02月05日
    浏览(37)
  • 【排序算法】C语言实现选择排序与冒泡排序

    这里是阿辉算法与数据结构专栏的第一篇文章,咱们就从排序算法开始讲起,排序算法有很多大致分为两类:基于比较的排序和非比较的排序 基于比较的排序:冒泡、选择、插入、希尔、堆、归并、随机快排 非比较的排序:桶排序 以上的排序算法阿辉都会讲到,今天阿辉主

    2024年02月04日
    浏览(31)
  • C语言分析基础排序算法——交换排序

    目录 交换排序 冒泡排序 快速排序 Hoare版本快速排序 挖坑法快速排序 前后指针法快速排序 快速排序优化 快速排序非递归版 见C语言基础知识指针部分博客C语言指针-CSDN博客 Hoare版本快速排序 Hoare版本快速排序的过程类似于二叉树前序遍历的过程,基本思想是:在需要排序的

    2024年03月14日
    浏览(36)
  • 算法 时间、空间复杂度的计算(C语言/小白/零基础/新手 + 例题)

    目录 1. 时间复杂度 计算时间复杂度( O(N))的方法:   例1:嵌套循环时间复杂度的计算      例2:双重循环时间复杂度的计算   例3:常熟循环的时间复杂度   例6:冒泡排序的时间复杂度   例7: 二分查找的时间复杂度   例8:斐波那契的时间复杂度         常见的时间

    2024年02月08日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包