0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详细介绍8种最常用的排序算法

冬至子 来源:good7ob 作者:good7ob 2023-06-06 14:52 次阅读

在计算机科学领域中,排序算法是一种基本的算法。排序算法可以将一个数据集合重新排列成一个按照某种规则有序的集合,常用于数据检索、数据压缩、数据加密等场合。在实际的应用中,我们需要根据不同的场景选择不同的排序算法,以达到最优化的效果。

本文将详细介绍8种最常用的排序算法,包括插入排序、冒泡排序、选择排序、快速排序、归并排序、希尔排序、堆排序和计数排序。我们将从算法原理、改进方案,再到代码兑现的角度透彻解析这8种排序算法,以帮助读者更好地理解和应用这些算法。

一、插入排序

插入排序是最简单的排序算法之一,它的基本思想是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。具体实现时,我们从第2个元素开始依次将每个元素与前面的有序序列比较,然后找到它的正确位置插入即可。插入排序的时间复杂度为O(n^2),但是在小规模数据的排序中效率较高。

插入排序的改进方案有希尔排序,它是插入排序的一种改进版,基本思想是将待排序的数组分割成若干个小的子数组,对这些子数组进行插入排序,然后再对整个数组进行一次插入排序。希尔排序的时间复杂度为O(nlogn)。

以下是插入排序的代码实现:

def insert_sort(array):
  n = len(array)
  for i in range(1, n):
      key = array[i]
      j = i - 1
      while j >= 0 and array[j] > key:
          array[j + 1] = array[j]
          j -= 1
      array[j + 1] = key
  return array

二、冒泡排序

冒泡排序是一种简单的排序算法,它的基本思想是重复地遍历要排序的数组,每次比较相邻的两个元素,如果它们的顺序错误就交换它们的位置。冒泡排序的时间复杂度为O(n^2),但是它的空间复杂度比插入排序低,因为它只需要一个额外的空间来存储交换时的中间值。

冒泡排序的改进方案有鸡尾酒排序,它是冒泡排序的一种改进版,它的基本思想是先从左到右遍历数组,然后从右到左遍历数组,再从左到右遍历数组,以此类推。鸡尾酒排序的时间复杂度与冒泡排序相同,但是在某些情况下它的效率更高。

以下是冒泡排序的代码实现:

def bubble_sort(array):
  n = len(array)
  for i in range(n - 1):
      for j in range(n - i - 1):
          if array[j] > array[j + 1]:
              array[j], array[j + 1] = array[j + 1], array[j]
  return array

三、选择排序

选择排序是一种简单直观的排序算法,它的基本思想是每次选择一个最小的元素,并将它放在序列的起始位置。选择排序的时间复杂度为O(n^2),但是由于它每次只需要交换一次,因此它的运行时间与数据的初始状态无关。

以下是选择排序的代码实现:

def selection_sort(array):
  n = len(array)
  for i in range(n - 1):
      min_index = i
      for j in range(i + 1, n):
          if array[j] < array[min_index]:
              min_index = j
      array[i], array[min_index] = array[min_index], array[i]
  return array

四、快速排序

快速排序是一种分治思想的排序算法,它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可以分别对这两部分记录继续进行排序,以达到整个序列有序的目的。快速排序的时间复杂度为O(nlogn),但是在最坏情况下时间复杂度为O(n^2)。

以下是快速排序的代码实现:

def quick_sort(array):
  if len(array) < 2:
      return array
  pivot = array[0]
  less = [x for x in array[1:] if x <= pivot]
  greater = [x for x in array[1:] if x > pivot]
  return quick_sort(less) + [pivot] + quick_sort(greater)

五、归并排序

归并排序是一种分治思想的排序算法,它的基本思想是将待排序的序列分成若干个子序列,每个子序列都是有序的,然后再将子序列合并成整体有序序列。归并排序的时间复杂度为O(nlogn)。

以下是归并排序的代码实现:

def merge_sort(array):
  if len(array)   2:
      return array
  mid = len(array) // 2
  left = merge_sort(array[:mid])
  right = merge_sort(array[mid:])
  result = []
  i = j = 0
  while i   len(left) and j

六、堆排序

堆排序是一种树形选择排序,它的基本思想是将待排序序列构造成一个堆,然后依次将堆顶元素和末尾元素交换,然后重新调整堆。堆排序的时间复杂度为O(nlogn)。

以下是堆排序的代码实现:

def heapify(array, n, i):
  largest = i
  left = 2 * i + 1
  right = 2 * i + 2
  if left   n and array[left]  > array[largest]:
      largest = left
  if right   n and array[right]  > array[largest]:
      largest = right
  if largest != i:
      array[i], array[largest] = array[largest], array[i]
      heapify(array, n, largest)
def heap_sort(array):
  n = len(array)
  for i in range(n // 2 - 1, -1, -1):
      heapify(array, n, i)
  for i in range(n - 1, 0, -1):
      array[0], array[i] = array[i], array[0]
      heapify(array, i, 0)
  return array

七、希尔排序

希尔排序是一种改进版的插入排序,它的基本思想是将待排序序列按照一定间隔分成若干个子序列,然后对子序列进行插入排序,最后再对整个序列进行插入排序。希尔排序的时间复杂度与间隔序列的选取有关,最优的时间复杂度为O(nlogn)。

以下是希尔排序的代码实现:

def shell_sort(array):
  n = len(array)
  gap = n // 2
  while gap > 0:
      for i in range(gap, n):
          temp = array[i]
          j = i
          while j >= gap and array[j - gap] > temp:
              array[j] = array[j - gap]
              j -= gap
          array[j] = temp
      gap //= 2
  return array

八、计数排序

计数排序是一种非比较排序,它的基本思想是统计待排序序列中每个元素出现的次数,然后依次将每个元素输出,计数排序的时间复杂度为O(n+k),其中k为最大值和最小值之差。

以下是计数排序的代码实现:

def counting_sort(array):
  max_value = max(array)
  min_value = min(array)
  count = [0] * (max_value - min_value + 1)
  for num in array:
      count[num - min_value] += 1
  res = []
  for i in range(len(count)):
      res += [i + min_value] * count[i]
  return res

结论

以上介绍了最常用的8个排序算法的原理、改进以及代码实现。不同的排序算法适用于不同的场景,我们需要根据实际情况选择最合适的排序算法。在实际应用中,我们需要考虑时间复杂度、稳定性、空间复杂度等因素。比如,对于数据量较小的序列,我们可以选择插入排序或者冒泡排序;对于大规模数据的排序,我们可以选择快速排序或者归并排序。

除此之外,还需要考虑到排序算法的稳定性,即相同元素的相对顺序是否会发生改变。对于需要保持相同元素相对顺序的排序任务,我们需要选择稳定的排序算法,比如归并排序、插入排序、冒泡排序、计数排序等。

总之,在实际开发中,排序算法是必不可少的工具,我们需要根据实际情况选择最适合的排序算法,以提高程序的性能和效率。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计算机
    +关注

    关注

    19

    文章

    6651

    浏览量

    84562
  • 排序算法
    +关注

    关注

    0

    文章

    50

    浏览量

    10021
收藏 人收藏

    评论

    相关推荐

    FPGA排序-冒泡排序介绍

    排序算法是图像处理中经常使用一种算法,常见的排序算法有插入排序、希尔
    发表于 07-17 10:12 671次阅读
    FPGA<b class='flag-5'>排序</b>-冒泡<b class='flag-5'>排序</b><b class='flag-5'>介绍</b>

    十大排序算法总结

    排序算法是最经典的算法知识。因为其实现代码短,应该广,在面试中经常会问到排序算法及其相关的问题。一般在面试中
    的头像 发表于 12-20 10:39 721次阅读

    Java常用排序算法&程序员必须掌握的8排序算法+二分法查找

    Java常用排序算法&程序员必须掌握的8排序算法+二分法查找
    发表于 10-19 19:33

    嵌入式stm32实用的排序算法 - 交换排序

    排序冒牌排序是我们读书时最先接触的一排序算法,也是比较经典的排序
    发表于 04-12 13:14

    C语言实现常用排序算法是什么?

    C语言实现常用排序算法是什么?
    发表于 10-19 06:41

    算法的三结构介绍

    嵌入式学习日记2018.11.62018.11.16理论学习阶段计算机科学导论(原书第二版)第8算法学到的新知识1算法的三结构:顺序、判断(选择)和重复(循环)2
    发表于 11-08 07:12

    介绍几种常用排序算法C实现

    文章目录1、冒泡排序法2、选择排序3、插入排序4、快速排序(快排)5、归并排序1、冒泡排序
    发表于 12-21 06:31

    数控机床插补算法最常用的三种算法源码

    三菱PLC(可编程逻辑控制器)编程实例项目例程——数控机床插补算法最常用的三种算法源码
    发表于 11-08 17:32 43次下载

    常用排序算法总览

    我们通常所说的排序算法往往指的是内部排序算法,即数据记录在内存中进行排序
    的头像 发表于 06-13 18:18 2597次阅读
    <b class='flag-5'>常用</b>的<b class='flag-5'>排序</b><b class='flag-5'>算法</b>总览

    常用的非比较排序算法:计数排序,基数排序,桶排序详细资料概述

    这篇文章中我们来探讨一下常用的非比较排序算法:计数排序,基数排序,桶排序。在一定条件下,它们的时
    的头像 发表于 06-18 15:11 6822次阅读
    <b class='flag-5'>常用</b>的非比较<b class='flag-5'>排序</b><b class='flag-5'>算法</b>:计数<b class='flag-5'>排序</b>,基数<b class='flag-5'>排序</b>,桶<b class='flag-5'>排序</b>的<b class='flag-5'>详细</b>资料概述

    常用排序算法分析

    一种是比较排序,时间复杂度O(nlogn) ~ O(n^2),主要有:冒泡排序,选择排序,插入排序,归并排序,堆
    的头像 发表于 07-13 16:13 1970次阅读

    实用的排序算法 - 交换排序

    实用的排序算法 - 交换排序
    的头像 发表于 03-20 09:53 1562次阅读
    实用的<b class='flag-5'>排序</b><b class='flag-5'>算法</b> -  交换<b class='flag-5'>排序</b>

    数学建模中的常用算法详细介绍

    本文档的主要内容详细介绍的是数学建模中的常用算法详细介绍
    发表于 07-20 08:00 2次下载
    数学建模中的<b class='flag-5'>常用</b><b class='flag-5'>算法</b><b class='flag-5'>详细</b><b class='flag-5'>介绍</b>

    解析数据结构的常用七大排序算法

    为了让大家掌握多种排序方法的基本思想,本篇文章带着大家对数据结构的常用七大算法进行分析:包括直接插入排序、希尔排序、冒泡
    的头像 发表于 03-16 08:22 1445次阅读

    熟练掌握常用排序算法

    排序是数据处理中经常运用的一种重要运算,排序的功能是将一个数据元素(记录)的任意序列,重新排列成一个按照一个规则有序的序列。常用排序算法
    的头像 发表于 08-20 09:40 1844次阅读
    熟练掌握<b class='flag-5'>常用</b>的<b class='flag-5'>排序</b><b class='flag-5'>算法</b>