数据结构复习之排序算法的总结回顾

根据排序过程中借助的主要操作,我们将内排序分为四类:

  •   插入排序类

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

从算法的简单性来看,我们将7种算法分为两类:

  • 简单算法:冒泡排序、简单选择排序、直接插入排序
  • 改进算法:希尔排序、堆排序、归并排序、快速排序

对7中算法的各种指标进行对比:

  平均情况看:显然最后三种算法要胜过希尔算法,并远远超过前3种简单算法。

  最好情况看:反而冒泡和直接插入排序要更胜一筹,也就是说,如果待排序序列总是基本有序,反而并应该考虑4种改进算法。

  最坏情况看:堆排序与归并排序要强过与快速排序以及其他简单排序。

  空间复杂度:归并排序的空间要求为O(n),快速排序为O(logn)~O(n),而其他几种排序空间要求均为O(1),

        如果执行算法的软件所处的环境非常在乎内存的使用量时,选择归并排序和快速排序就不是一个较好的策略。

  稳定性:归并排序独占鳌头,对于非常在乎排序稳定性的应用中,归并排序是个好算法。

  待排序记录的个数:待排序的个数n越小,采用简单排序方法越合适。反之n越大,采用改进方法越合适。

           这就是优化改进算法时增加一个阀值的原因,低于阀值时采用简单排序方法。

  综合各项指标来说:经过优化的快速排序是性能最好的排序算法。

注:不同场合我们应该考虑使用不同的算法来应对它,以达到最优。具体问题具体对待。

时间: 2024-11-03 12:11:08

数据结构复习之排序算法的总结回顾的相关文章

数据结构复习之查找算法的总结回顾

一.查找的基本概念 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值得数据元素(或记录). 查找表(Search Table)是同一类型的数据元素(或记录)构成的集合. 查找表按照操作方式分为两大类: 静态查找表:只作查找操作的查找表. 顺序表查找.有序表查找.线性索引查找 动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个元素. 二叉排序树.平衡二叉树(AVL树).多路查找树(B树) 二.顺序表查询 这是最简单的一种,

数据结构与算法复习(一) 排序算法(I)

这篇文章将会介绍最常见的排序算法(使用 JavaScript 语言实现) PS:这里我会尽量使用语言无关的语法去写,大家不要太在意语言,重要的是算法的实现思路 1.冒泡排序 将数组分为有序区(左边)和无序区(右边) 每次从无序区的最后一个元素开始,一直向前冒泡到无序区的第一个位置,使其变成有序 function swap(A, i, j) { if (i === j) return [A[i], A[j]] = [A[j], A[i]] } function bubbleSort(A) { fo

(2)Java数据结构--二叉树 -和排序算法实现

=== 注释:此人博客对很多个数据结构类都有讲解-并加以实例 Java API —— ArrayList类 & Vector类 & LinkList类Java API —— BigDecimal类Java API —— BigInteger类Java API —— Calendar类Java API —— DateFormat类Java API —— Date类Java API —— HashMap类 & LinkedHashMap类Java API —— JDK5新特性Java

数据结构之高级排序算法

一.希尔排序 希尔排序(缩小增量法) 属于插入类排序,由Shell提出,希尔排序对直接插入排序进行了简单的改进:它通过加大插入排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项大跨度地移动,当这些数据项排过一趟序之后,希尔排序算法减小数据项的间隔再进行排序,依次进行下去,进行这些排序时的数据项之间的间隔被称为增量,习惯上用字母h来表示这个增量. 具体代码实现: 1 package data.struct.algorithm; 2 3 //高级排序算法之希尔排序 4 class

算法和数据结构~各位排序算法的介绍与实现(C#)

排序是指将元素集合按照规定的顺序排列.通常有两种排序方法,升序排列和降序排列.例如,对整数集{5,2,7,1}进行升序排列,结果为{1,2,5,7},对其进行降序排列结果为{7,5,2,1}.总的来说,排序的目的是使数据能够以更有意义的形式表现出来.虽然排序最显著的应用是排列数据以显示它,但它往往可以用来解决其他的问题,特别是作为某些已成型算法的一部分.      总的来说,排序算法分为两大类:比较排序和线性时间排序.比较排序依赖于比较和交换来将元素移动到正确的位置上.令人惊讶的是,并不是所有的

【数据结构】常用排序算法(包括:选择排序,堆排序,冒泡排序,选择排序,快速排序,归并排序)

直接插入排序: 在序列中,假设升序排序 1)从0处开始. 1)若走到begin =3处,将begin处元素保存给tmp,比较tmp处的元素与begin--处元素大小关系,若begin处<begin-1处,将begin-1处元素移动到begin:若大于,则不变化.再用tmp去和begin--处的元素用同样的方法去作比较,直至begin此时减少到数组起始坐标0之前结束. 3)以此类推,依次走完序列. 时间复杂度:O() 代码如下: //Sequence in ascending order  voi

【数据结构】选择排序算法示例

基本选择排序编辑 排序算法即解决以下问题的算法: 输入 n个数的序列<a1,a2,a3,...,an>. 输出 原序列的一个重排<a1*,a2*,a3*,...,an*>:,使得a1*<=a2*<=a3*<=...<=an* 排序算法有很多,包括插入排序,冒泡排序,堆排序,归并排序,选择排序,计数排序,基数排序,桶排序,快速排序等.插入排序,堆排序,选择排序,归并排序和快速排序,冒泡排序都是比较排序,它们通过对数组中的元素进行比较来实现排序,其他排序算法则是

数据结构(四)常用排序算法-选择、插入、希尔

选择排序 实现思路: 1.将需排序的集合设为A,已经排好顺的集合为B(在未排序前B集合为空). 2.每次从A集合中查找出最大或者最小的元素后放入集合B中 3.同时将该元素从集合A中移除. 4.循环执行以上两步直到集合A为空,B集合中的元素就有序了. 缺点: 效率低,时间复杂度为 O(n*n),是一种只适合小数据集的原地排序算法.   示范代码 1  public class CommSort { 2      // 比较大小 3      @SuppressWarnings({ "rawtype

[数据结构] 几种排序算法

插入排序 直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的元素,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止. 设数组为a[0-n-1]. 1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1].令i=1 2. 将a[i]并入当前的有序区a[0-i-1]中形成a[0-i]的有序区间. 3. i++并重复第二步直到i==n-1.排序完成.   希尔排序 希尔排序的实质就是分组插入排序. 该方法的基本思想是:先将整个待排元素序