zoukankan      html  css  js  c++  java
  • 数据结构排序算法稳定性总结——写给自己看

    一、排序分类

    (1)插入类:直接插入排序、折半插入排序、希尔排序

    (2)交换类:冒泡排序、快速排序

    (3)选择类:简单选择排序、堆排序(属于树形选择排序)

    (4)归并类:2-路归并排序

    (5)分配类:基数排序

    二、排序稳定性及其原因

    (1)稳定排序:直接插入排序、折半插入排序、冒泡排序、2-路归并排序、基数排序

    • 直接插入排序:每次将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上。在数组内部前半部为排好序的记录,后半部是未排好序的。比较时从前半部后向前比较,所以不会改变相等记录的相对位置。
    • 折半插入排序:将直接插入排序关键字比较时的查找利用“折半查找”来实现,本质并没有改变还是一种稳定排序。
    • 冒泡排序:通过两两比较相邻记录的关键字,如果发生逆序,则进行交换。也不会改变相等记录的相对位置。
    • 2-路归并排序:将两个有序表合并成一个有序表。每次划分的两个子序列前后相邻。合并时每次比较两个有序子序列当前较小的一个关键字,将其放入排好序的序列尾部。因为两子序列相邻,合并时也没有改变相等记录的相对位置,所以也是稳定的。
    • 基数排序:对待排序序列进行若干趟“分配”和“收集”来实现排序。分配时相等记录被分配在一块,没有改变相对位置,是一种稳定排序。

    (2)不稳定排序:希尔排序、快速排序、堆排序

    • 希尔排序:采用分组插入的方法,将待排序列分割成几组,从而减少直接插入排序的数据量,对每组分别进行直接插入排序,然后增加数据量,重新分组。经过几次分组排序之后,对全体记录进行一次直接插入排序。但是希尔对记录的分组,不是简单的“逐段分割”,而是将相隔每个“增量”的记录分成一组(假如:有1~10十个数,以2为增量则分为13579、246810两组)。这种跳跃式的移动导致该排序方法是不稳定的。
    • 快速排序:改进的冒泡排序。冒泡只比较相邻的两个记录,每次交换只能消除一个逆序。快排就是通过交换两个不相邻的记录,达到一次消除多个逆序。正是这个非顺次移动导致该排序方法是不稳定的。
    • 堆排序:将待排序的记录r[1..n]看出是一颗完全二叉树的顺序存储结构,利用完全二叉树双亲节点孩子节点之间的内在关系,选择出最大(最小)的记录。因为双亲和孩子节点在数组中的位置不是顺次的,调整堆时是非顺次移动,所以该排序也是不稳定的。

    (3)不确定是否稳定的排序:简单选择排序

    • 简单选择排序:每次从未排序的记录中选择最小的关键字,将其放到排好序的记录尾部。就该排序方法本身来讲,它是一种稳定排序。但是如果实现时采用“交换记录”的策略,就会产生不稳定现象,所以是否稳定取决于该算法采用的策略。
  • 相关阅读:
    Activity中Intent的知识
    详解 Android 的 Activity 组件
    Android xml资源文件中@的含义
    为App签名的其他方法
    如何将Android程序打包成apk文件
    创建Android虚拟设备(AVD)
    Android开发环境搭建
    论适应和麻木
    一些有趣的图片
    python 写一个scheme 解释器 (二)——简单求值器内核
  • 原文地址:https://www.cnblogs.com/weiyalin/p/10743955.html
Copyright © 2011-2022 走看看