`

几种排序算法比较

 
阅读更多

一、引言

排序算法,是计算机编程中的一个常见问题。在日常的数据处理中,面对纷繁的数据,我们也许有成百上千种要求,因此只有当数据经过恰当的排序后,才能更符合用户的要求。因此,在过去的数十载里,程序员们为我们留下了几种经典的排序算法,他们都是智慧的结晶。本文将带领读者探索这些有趣的排序算法,其中包括介绍排序算法的某些基本概念以及几种常见算法,分析这些算法的时间复杂度,同时在最后将介绍我们独创的一种排序方法,以供读者参考评判。

二、几种常见算法的介绍及复杂度分析

1.基本概念

1.1稳定排序(stable sort)和非稳定排序

稳定排序是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,。反之,就是非稳定的排序。

比如:一组数排序前是a1,a2,a3,a4,a5,其中a2=a4,经过某种排序后为a1,a2,a4,a3,a5

则我们说这种排序是稳定的,因为a2排序前在a4的前面,排序后它还是在a4的前面。假如变成a1,a4,a2,a3,a5就不是稳定的了。

1.2内排序( internal sorting )和外排序( external sorting)

在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序;在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。

1.3算法的时间复杂度和空间复杂度

所谓算法的时间复杂度,是指执行算法所需要的计算工作量。一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。

 

2.几种常见算法

2.1冒泡排序(Bubble Sort

冒泡排序方法是最简单的排序方法。这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。显然,处理一遍之后,“最轻”的元素就浮到了最高位置;处理二遍之后,“次轻”的元素就浮到了次高位置。在作第二遍处理时,由于最高位置上的元素已是“最轻”元素,所以不必检查。一般地,第i遍处理时,不必检查第i高位置以上的元素,因为经过前面i-1遍的处理,它们已正确地排好序。

冒泡排序是稳定的。算法时间复杂度是O(n ^2)

2.2选择排序(Selection Sort

选择排序的基本思想是对待排序的记录序列进行n-1遍的处理,第i遍处理是将L[i..n]中最小者与L[i]交换位置。这样,经过i遍处理之后,前i个记录的位置已经是正确的了。

选择排序是不稳定的。算法复杂度是O(n ^2 )

2.3插入排序(Insertion Sort

插入排序的基本思想是,经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]L[i-1],如果L[i-1] L[i],则L[1..i]已排好序,第i遍处理就结束了;否则交换L[i]L[i-1]的位置,继续比较L[i-1]L[i-2],直到找到某一个位置j(1ji-1),使得L[j] L[j+1]时为止。图1演示了对4个元素进行插入排序的过程,共需要(a),(b),(c)三次插入。

直接插入排序是稳定的。算法时间复杂度是O(n   ^2)

2.4堆排序

堆排序是一种树形选择排序,在排序过程中,将A[n]看成是完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。

堆排序是不稳定的。算法时间复杂度O(nlog n)

2.5归并排序

设有两个有序(升序)序列存储在同一数组中相邻的位置上,不妨设为A[l..m]A[m+1..h],将它们归并为一个有序数列,并存储在A[l..h]

其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlog2n)

2.6快速排序

快速排序是对冒泡排序的一种本质改进。它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少1。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。

快速排序是不稳定的。最理想情况算法时间复杂度O(nlog2n),最坏O(n ^2)

2.7希尔排序

在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。D.L.shell1959年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。

希尔排序是不稳定的。算法时间复杂度是O(n2)

 

3.常见算法复杂度比较

 

 

  序号

 

排序类别

 

时间复杂度

 

空间复杂度

 

稳定

 

1

 

插入排序

 

O(n2)

 

1

 

 

2

 

希尔排序

 

O(n2)

 

1

 

×

 

3

 

冒泡排序

 

O(n2)

 

1

 

 

4

 

选择排序

 

O(n2)

 

1

 

×

 

5

 

快速排序

 

O(Nlogn)

 

O(logn)

 

×

 

6

 

堆排序

 

O(Nlogn)

 

1

 

×

 

7

 

归并排序

 

O(Nlogn)

 

O(n)

 

 

 

分享到:
评论

相关推荐

    c语言编程的几种排序算法比较

    【C语言编程的几种排序算法比较】 排序算法是计算机科学中的基础内容,广泛应用于各种数据处理和信息组织。由于在实际应用中往往需要处理大量数据,因此,排序算法的效率至关重要。衡量算法效率的主要标准是算法的...

    几种排序算法总结及比较

    这里我们将深入探讨几种常见的排序算法,并在VS2013环境下进行实现和比较。 1. 冒泡排序(Bubble Sort) 冒泡排序是一种简单的交换排序,它通过重复遍历待排序的数列,依次比较相邻元素并根据需要交换位置,直到...

    几种排序算法的时间比较

    使用vc的编译器可以编译运行。需要在运行中提供一个不短于1 000 000字节的纯数字文本o.txt作为数据输入。我用的是圆周率。然后就可以跑了。运用内联汇编进行时间...针对归并、快排、shell、插入、选择等多种排序设计。

    关于几种排序算法的比较分析

    关于数据的几种排序算法的程序对比分析,结合具体案例

    几种排序算法的比较

    本篇文章将详细探讨几种常见的排序算法,并结合VB编程环境进行比较。 1. 冒泡排序:冒泡排序是最基础的排序算法之一,通过不断交换相邻的不正确顺序元素来逐步完成排序。在VB中,可以使用For和If语句实现冒泡排序。...

    内部排序算法比较 课程设计

    【内部排序算法比较课程设计】主要关注的是对六种经典的内部排序算法的性能对比,包括起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序和堆排序。这些算法是计算机科学中用于对数据进行排序的基础工具,各...

    7种排序算法程序汇总

    7种排序算法程序汇总 冒泡排序 选择排序 插入排序 希排序尔 快速排序 二叉排序树 堆排序

    几种排序算法整理

    本文将深入探讨由C语言实现的几种常见排序算法,包括它们的基本原理、实现细节和性能特点。 首先,让我们从最经典的排序算法——冒泡排序(Bubble Sort)开始。冒泡排序通过不断地交换相邻的不正确顺序的元素来逐步...

    最常见的几种排序算法,来看看

    这里我们将深入探讨几种最常见的排序算法,包括冒泡排序、选择排序、插入排序、快速排序以及归并排序。 1. 冒泡排序(Bubble Sort) 冒泡排序是最基础的排序算法之一,它通过不断地比较相邻元素并交换位置来实现...

    数据结构课程设计(内部排序算法比较_C语言)

    ### 数据结构课程设计:内部排序算法比较_C语言 #### 一、课题背景与意义 排序作为数据结构中的重要组成部分,在实际开发中具有广泛的应用场景。理解不同排序算法的特点及其适用场景,对于提高程序效率和解决问题...

    设计一个测试程序比较几种内部排序算法的关键字比较次数和移动次数以取得直观感受。

    设计一个测试程序比较几种内部排序算法的关键字比较次数和移动次数以取得直观感受。 在本文中,我们将设计一个测试程序比较几种内部排序算法的关键字比较次数和移动次数,以取得直观感受。内部排序算法是指在内存中...

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

    本文将详细探讨标题所提及的几种排序算法:合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合Java语言的实现进行解析。 1. **合并排序(Merge Sort)**: 合并排序是一种基于分治策略的排序算法...

    几种排序算法的时间耗费比较

    本程序主要演示了归并,插入,快排等几种排序算法在各种不同数据量的情况下的算法效率,适合编程新手对排序算法的认识和学习

    几种常见排序算法实例

    本文将详细解析标题中提及的五种排序算法:位与、选择、冒泡、插入以及qsort,并结合在VC6.0环境下进行编译实践的情况。 1. **位与排序**: 位与操作符(`&`)在某些特定场景下可用于排序,例如在整数数组中,通过...

    各种排序算法比较

    文档中提供了几种排序算法的具体实现思路,这里选取两种算法进行详细分析: #### 1、选择排序 - **功能**:对数组进行升序排列。 - **输入**:数组名称及其元素数量。 - **算法思想**:通过每次从剩余未排序的部分...

    几种排序算法的代码实现

    根据给定文件中的标题、描述、标签以及部分内容,我们可以总结出以下关于几种排序算法的知识点,特别是关于希尔排序的相关细节。 ### 几种排序算法的代码实现 #### 1. **希尔排序** - **定义与原理**:希尔排序是...

    几种排序算法的实现(链表)

    下面我们将详细解析链表实现的几种排序算法,以及它们的优缺点。 1. **冒泡排序** (LinkList1.cpp 和 LinkList2.cpp): 冒泡排序是一种简单的交换排序,通过不断比较相邻元素并交换位置,使较大的元素逐渐"浮"到...

    数据结构 各种排序算法实现与比较

    编程实现选择、冒泡、直接插入、希尔、快速、堆、归并等几种排序算法,并计算每种算法的比较、移动次数。 完成功能的详细说明: 1.要求待排序数据从磁盘文件读入,实施排序后将数据写入另一文件。 2.实现选择、...

    几种经典排序算法的实现比较

    这四种排序算法各有特点,适用于不同的场景,对于大数据处理时的速度比较尤其关键。 1. **快速排序**: 快速排序由C.A.R. Hoare在1960年提出,是一种采用分治策略的排序算法。其基本思想是选取一个基准元素,将...

Global site tag (gtag.js) - Google Analytics