美文网首页
简单排序(选择排序、起泡排序和插入排序)使用详解

简单排序(选择排序、起泡排序和插入排序)使用详解

作者: you的日常 | 来源:发表于2022-01-04 11:46 被阅读0次

简单排序算法

简单排序算法是一类算法,指那些直观、易理解的排序算法的总和。

到现在为止,我们已经讲了的三种排序算法:选择排序、起泡排序和插入排序,都属于简单排序算法。

这三种算法有许多性能上的共性,本章就我们来类比看看。

时间复杂度

排序的时间复杂度

假设我们要排列的数值共有 n 个,那么排序算法的时间复杂度应该是大 O 符号下一个 n 的函数——Of(n)。

排序算法的时间复杂度不能一概而论,而是要区分最好情况,最坏情况和一般情况:

  • 最好 情况是指待排数列原本就是有序的;

  • 最坏 则是指待排数列是倒序的;

  • 最好最坏和介于两者之间的各种情况的综合属于一般( 平均 )情况。

最坏时间复杂度

enter image description here

我们先来看看最坏情况。最坏情况对应到实际中,是给一个倒序的数列排序。

从代码的角度来看,就是将一个算法中所有的代码全都足额跑满,没有任何中途的 break/return/exit!

既然如此,就让我们先来对比一下三个排序算法的代码:

def selectionSort(arr):
    for i in range(0, len(arr)):
        minPosition = i
        for j in range(i+1, len(arr)): 
            if (arr[j] < arr[minPosition]):
                minPosition = j
        swap(arr, i, minPosition) 
    return

def bubbleSort(arr):
    for i in range(0, len(arr) - 1):
        swapped = False
        for j in range(len(arr) -1, i, -1):
            if (arr[j] < arr[j - 1]):
                swap(arr, j, j-1)
                swapped = True
        if (not swapped):
            return
    return

def insertionSort(arr):
    if (len(arr) == 1):
        return
    for i in range(1,len(arr)):
        for j in range(i, 0, -1): 
            if arr[j] < arr[j-1]:
                swap(arr, j, j - 1)
            else:
                break
    return            

大家发现没有,这三个算法的主体结构,都是两重嵌套的循环。

在这里再向大家透露一个窍门:一旦遇到这种两重循环的结构,当其无论内循环还是外循环都和数据量(n)直接相关时,我们基本上可以肯定,它的最差情况时间复杂度就是 O(n2).

如果不信,咱们可以一个个来看一下:

  • 选择排序:

    • 第 1 次迭代,外圈走 1 步,内圈走 (n−1)步;
    • 第 2 次迭代,外圈走 1 步,内圈走 (n−2)步;
    • ……
    • 第 n−1 次迭代,外圈走 1 步,内圈走 1 步;
    • 第 n 次迭代,外圈走 1 步,内圈跳过;全部迭代结束。

相关文章

  • IOS 常用算法

    一:排序算法 排序方式有插入排序,选择排序和交换排序三种。插入排序有直接插入排序和希尔排序。选择排序有简单选择排序...

  • 排序法

    排序分 内部排序和外部排序 内部排序: 插入排序:{直接插入排序,希尔排序} 选择排序:{简单选择排序,堆排序} ...

  • 简单排序(选择排序、起泡排序和插入排序)使用详解

    简单排序算法 简单排序算法是一类算法,指那些直观、易理解的排序算法的总和。 到现在为止,我们已经讲了的三种排序算法...

  • android算法 - 排序

    冒泡排序 选择排序 插入排序 快速排序 堆排序 其中简单排序就是冒泡排序,选择排序和插入排序。继而在分冶合并思想上...

  • 给自己备份的排序代码

    交换排序 冒泡排序 快速排序 插入排序 直接插入排序 希尔排序 选择排序 简单选择排序 堆排序

  • Java排序算法

    插入排序 直接插入排序 折半插入排序 交换排序 冒泡排序 快速排序 选择排序 简单选择排序 堆排序 其他排序 二路...

  • 常用排序算法(Python实现), 持续更新中

    一、非线性时间比较类排序 交换排序冒泡排序快速排序 插入排序简单插入排序希尔排序 选择排序简单选择排序堆排序 归并...

  • 算法与数据结构知识汇总(八、常见的八大排序算法)

    排序技术有:插入排序(直接插入排序、希尔排序)、选择排序(简单选择排序、堆排序)、交换排序(冒泡排序、快速排序)、...

  • 排序算法

    排序算法 非线性时间比较类排序 交换排序 冒泡排序 快速排序 插入排序 插入排序 希尔排序 选择排序 简单选择排序...

  • 九种排序算法(重要!!)

    分类:(九种排序算法) 1、插入排序:直接插入排序、二分插入排序、希尔排序; 2、选择排序:简单选择排序、堆排序 ...

网友评论

      本文标题:简单排序(选择排序、起泡排序和插入排序)使用详解

      本文链接:https://www.haomeiwen.com/subject/jcrbrktx.html