`

计算机排序算法

阅读更多

在计算机科学与数学中,一个排序算法(Sorting algorithm)是一种能将一串数据依照特定排序方式的一种算法。最常用到的排序方式是数值顺序以及字典顺序。有效的排序算法在一些算法(例如搜索算法与合并算法)中是重要的,如此这些算法才能得到正确解答。排序算法也用在处理文字数据以及产生人类可读的输出结果。基本上,排序算法的输出必须遵守下列两个原则:

  1. 输出结果为递增串行(递增是针对所需的排序顺序而言)
  2. 输出结果是原输入的一种排列、或是重组

虽然排序算法是一个简单的问题,但是从计算机科学发展以来,在此问题上已经有大量的研究。举例而言,冒泡排序在1956年就已经被研究。虽然大部分人认为这是一个已经被解决的问题,有用的新算法仍在不断的被发明。(例子:图书馆排序在2004年被发表)

分类

在计算机科学所使用的排序算法通常被分类为:

  • 计算的复杂度(最差、平均、和最好性能),依据列表(list)的大小(n)。一般而言,好的性能是O(n log n),且坏的性能是O(n2)。对于一个排序理想的性能是O(n)。仅使用一个抽象关键比较运算的排序算法总平均上总是至少需要O(n log n)。
  • 存储器使用量(以及其他电脑资源的使用)
  • 稳定度:稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序。也就是一个排序算法是稳定的,就是当有两个有相等关键的纪录RS,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。
  • 一般的方法:插入、交换、选择、合并等等。交换排序包含冒泡排序和快速排序。选择排序包含希尔排序和堆排序。

稳定度

当相等的元素是无法分辨的,比如像是整数,稳定度并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。

(4, 1)  (3, 1)  (3, 7)  (5, 6)

在这个状况下,有可能产生两种不同的结果,一个是依照相等的键值维持相对的次序,而另外一个则没有:

(3, 1)  (3, 7)  (4, 1)  (5, 6)   (维持次序)
(3, 7)  (3, 1)  (4, 1)  (5, 6)   (次序被改变)

不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此。不稳定排序算法可以被特别地实现为稳定。作这件事情的一个方式是人工扩充键值的比较,如此在其他方面相同键值的两个对象间之比较,(比如上面的比较中加入第二个标准:第二个键值的大小)就会被决定使用在原先数据次序中的条目,当作一个同分决赛。然而,要记住这种次序通常牵涉到额外的空间负担。

排列算法列表

在这个表格中,n是要被排序的纪录数量以及k是不同键值的数量。

稳定的

  • 冒泡排序(bubble sort) — O(n2)
  • 鸡尾酒排序 (Cocktail sort, 双向的冒泡排序) — O(n2)
  • 插入排序 (insertion sort)— O(n2)
  • 桶排序 (bucket sort)— O(n); 需要 O(k) 额外空间
  • 计数排序 (counting sort) — O(n+k); 需要 O(n+k) 额外空间
  • 合并排序 (merge sort)— O(n log n); 需要 O(n) 额外空间
  • 原地合并排序 — O(n2)
  • 二叉排序树排序 (Binary tree sort) — O(n log n)期望时间; O(n2)最坏时间; 需要 O(n) 额外空间
  • 鸽巢排序 (Pigeonhole sort) — O(n+k); 需要 O(k) 额外空间
  • 基数排序 (radix sort)— O(n·k); 需要 O(n) 额外空间
  • Gnome 排序 — O(n2)
  • 图书馆排序 — O(n log n) with high probability, 需要 (1+ε)n 额外空间

不稳定

  • 选择排序 (selection sort)— O(n2)
  • 希尔排序 (shell sort)— O(n log n) 如果使用最佳的现在版本
  • 组合排序 — O(n log n)
  • 堆排序 (heapsort)— O(n log n)
  • 平滑排序 — O(n log n)
  • 快速排序 (quicksort)— O(n log n) 期望时间, O(n2) 最坏情况; 对于大的、乱数列表一般相信是最快的已知排序
  • Introsort — O(n log n)
  • Patience sorting — O(n log n + k) 最坏情况时间,需要 额外的 O(n + k) 空间,也需要找到最长的递增子串行(longest increasing subsequence)

不实用的排序算法

  • Bogo排序 — O(n × n!),最坏的情况下期望时间为无穷。
  • Stupid sort — O(n3); 递归版本需要 O(n2) 额外存储器
  • 珠排序(Bead sort) — O(n) or O(√n), 但需要特别的硬件
  • Pancake sorting — O(n), 但需要特别的硬件
  • [Stooge排序] 算法简单,但需要约n^2.7的时间

平均时间复杂度

平均时间复杂度由高到低为:

  • 冒泡排序 O(n2)
  • 插入排序 O(n2)
  • 选择排序 O(n2)
  • 归并排序 O(n log n)
  • 堆排序 O(n log n)
  • 快速排序 O(n log n)
  • 希尔排序 O(n1.25)
  • 基数排序 O(n)

说明:虽然完全逆序的情况下,快速排序会降到选择排序的速度,不过从概率角度来说(参考信息学理论,和概率学),不对算法做编程上优化时,快速排序的平均速度比堆排序要快一些。

分享到:
评论

相关推荐

    计算机排序算法.pdf

    计算机排序算法是计算机科学中的一个基础且至关重要的领域,它涉及如何有效地组织和排列数据序列。排序算法的主要目标是将一组无序的数据按照特定的顺序(如数值升序或降序,字典顺序等)进行排列。这些算法广泛应用...

    归并排序 sort 计算机排序算法

    归并排序是一种高效的计算机排序算法,属于比较排序的范畴,由John W. Backus在1945年提出。它的基本思想是利用分治法(Divide and Conquer)将大问题分解为小问题来解决。归并排序的核心在于两个主要步骤:分割和...

    计算机排序算法(1).pdf

    计算机排序算法是编程领域中的核心概念,用于组织和优化数据处理。这里有五种常见的排序算法:快速排序、堆排序、归并排序、插入排序以及二分插入排序。 1. **快速排序**: - 由Tony Hoare开发,采用分治策略。 -...

    计算机算法总结之排序

    归并排序(Merge Sort)是一种采用分治法的排序算法,它将已有序的子序列合并,得到完全有序的序列。具体做法是,先递归地将当前序列分成两半进行排序,然后将有序的子序列合并在一起,这样整个序列就变成有序的了。...

    最快的排序算法 计算机最快的算法-史上14个最快速算法:孩子的计算能力爆表!大脑堪比计算机!...,排序算法数据结构

    在计算机科学领域中,排序算法是一种基本的算法,它可以将数据按照一定的顺序排列,以便更好地存储、检索和处理数据。排序算法的速度和效率对程序的性能有着至关重要的影响。 1.冒泡排序算法 冒泡排序算法是一种...

    常用排序算法的动态演示系统

    这些算法都是在计算机科学中最基本和最重要的排序算法,广泛应用于各种数据处理和分析领域。 1. 冒泡排序法 冒泡排序法是一种简单的排序算法,通过不断地比较相邻的元素,直到没有元素再需要交换为止。其实现步骤...

    常见经典排序算法(C语言)1希尔排序 二分插入法 直接插入法 带哨兵的直接排序法 冒泡排序 选择排序 快速排序 堆排序.docx

    常见的经典排序算法有希尔排序、二分插入法、直接插入法、带哨兵的直接排序法、冒泡排序、选择排序、快速排序、堆排序等。 一、希尔排序(Shell 排序法) 希尔排序法,又称宿小增量排序,是 1959 年由 D.L.Shell ...

    查找与排序算法的实现和应用

    常见的排序算法有插入排序、快速排序、选择堆积排序法等。 插入排序算法是一种简单的排序算法,适用于小规模的数据结构。该算法将数据结构分成已排序部分和未排序部分,并将未排序部分的元素插入到已排序部分中。...

    排序算法实验报告

    希尔排序,冒泡排序、快速排序递归排序,快速排序非递归排序,快速排序改进算法

    排序算法(C语言实现)

    在计算机科学中,排序算法是数据结构领域的重要组成部分,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序排列。本资源提供了三种经典的排序算法的C语言实现:堆排序、直接插入排序和快速排序。 首先,让...

    各种排序算法比较(java实现)

    在IT领域,排序算法是计算机科学中的基础但至关重要的部分,尤其在数据处理和数据分析中起着关键作用。本文将详细探讨标题所提及的几种排序算法:合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并...

    基于比较的排序算法汇总 选择排序法 插入排序法 归并排序法 快速排序法 堆排序法 冒泡排序法 希尔排序法

    在IT领域,排序算法是计算机科学中的基础但至关重要的概念,尤其在数据处理和算法设计中扮演着核心角色。本文将深入探讨标题中提到的几种基于比较的排序算法:选择排序、插入排序、归并排序、快速排序、堆排序、冒泡...

    直接排序法,折半插入法,希尔排序法,快速排序法(c语言实现)

    直接排序法、折半插入法、希尔排序法和快速排序法是计算机科学中常见的排序算法,它们在数据处理和算法理解上都具有重要的地位。这些排序算法的C语言实现为初学者提供了很好的学习材料,特别是在VC++6.0环境下进行...

    对于计算机信息排序算法处理-计算机科学与技术本科毕业设计.doc

    目前,最常见的排序算法有直接排序法、希尔排序法、冒泡排序法、选择排序法、快速排序法、堆排序等算法。这些排序算法各有自己的优缺点,不同的排序算法适应不同的情况。 3. 概要设计 3.1 抽象数据类型定义 排序...

    c语言链表的排序算法-排序链表最快的算法是什么?.pdf

    链表排序算法的性能分析和优化 在计算机科学中,链表是一种常用的数据结构,用于存储和管理大量数据。...* 计算机环境对链表排序算法的影响:计算机环境和链表的特点对链表排序算法的性能有着非常大的影响。

    排序及基本算法

    5. **基数排序**:基数排序是一种非比较型整数排序算法,其原理类似于人们手工排序扑克牌的过程。它按位数从低位到高位进行排序,适用于固定长度的整数排序。 #### 三、排序算法的比较与选择 不同的排序算法在时间...

    各种排序算法的实验(源代码+实验报告)

    在计算机科学领域,排序算法是数据结构与算法分析中的核心部分。它们用于对一组数据进行排列,以便于后续处理或优化查找效率。本资源“各种排序算法的实验(源代码+实验报告)”提供了一个全面的平台,用C++语言实现...

    实现所有经典排序算法汇总

    它通过将待排序的数组元素按某个增量分组,对每组使用直接插入排序算法排序,然后逐渐减少增量,直到增量为1,整个数组成为一个有序序列。 6. **归并排序(Merge Sort)** 归并排序是一种分治的排序算法,将待排序的...

    排序算法演示小程序

    排序算法是计算机科学中的核心概念,它涉及到如何有效地组织数据以达到特定的顺序。在这个"排序算法演示小程序"中,我们可以看到六种经典的排序算法被实现和演示:交换排序、快速排序、插入排序、堆排序、选择排序...

Global site tag (gtag.js) - Google Analytics