zoukankan      html  css  js  c++  java
  • 浅谈 各种排序的稳定性

    前言

    本文只是解释为什么该排序稳不稳定,不进行排序的讲解,所以适合有了排序的基础再来浏览

    稳定性

    也就是说一个序列中的相同值,它排序后,它的相同值的顺序不会改变即稳定

    冒泡(稳定)

    冒泡原理遵循大数下沉小数冒泡,思路是每次相邻两个进行交换,因为是每次找到当前最小数然后进行一格一格的移动,因为是一格一格的一道,相同的数字并不会出现后一个数字跳两格的情况跳到前面,只可能是两个数一起前移或者后移,所以该排序是稳定的

     

    选择(不稳定)

    选择原理和冒泡差不多,但是它省去了相邻交换的这个步骤,直接找到最小的位置,直接换过来,这个的交换移动位置就是跳跃式的,也可能出现两个数,前一个被换到后面去

    例子  5 9 5 2     第一个5会与2进行交换,然后就出现了两个相同值出现顺序改变的情况,因为第一个5在移动,而第二个5没有移动,所以就可能出现这种情况,冒泡是整体的移动

    插入(稳定)

    插入就是从后往前一个一个的找,然后找到适合位置就放在这,也是整体往后移,很明显,稳不稳定取决于当前判断是<=还是<,这种人为可以操控的都是稳定的

    快速排序(不稳定)

    快排的话很明显的一个不稳定的地方就是一个指针从前往后,一个指针从后往前,然后后一个指针换到前一个位置,但是这个指针又是往另一方向走的,这就和我们顺序相悖了

    例子 2 3 3 3 1 1 1

    这样相同的数肯定是以相反的顺序换过去

    归并(稳定)

    归并的核心地方就在于有序归并这块儿,归并的时候是判断两个数的大小然后再放,那么我们只要控制两个相同数都是前一个序列先放那么就能保证稳定性了

    堆排(不稳定)

    这个就比较那个了,一棵树,然后下沉的时候可能是左子树可能是右子树,如果相同值在左子树,然后自己降到右子树那么就不稳定了

    例子   3 3 2

             3(1)                           2

           /                 ->          /     

     3 (2)         2         3(2)    3(1)

    希尔排序(不稳定)

    希尔排序的是通过取增量然后划分成不同分组,最后增量不断减小,来将分组合并的,主要利用了插入排序的最好情况O(n)的思想,如果本身大量有序,那么需要比较次数就减小了很多,因为希尔排序是同各国不同分组的,也就是说如果两个相同值划分在了不同分组的话,那么就有可能出现顺序颠倒问题,从而不稳定

     例子   3(1)    3(2)     1    4

    第一轮   1    3(2)     3(1)     4

    第二轮    同上

  • 相关阅读:
    leetcode 890. 查找和替换模式 Python
    TensorFlow-GPU+cuda8+cudnn6+anaconda安装遇到的版本错误
    leetcode 921. 使括号有效的最少添加(Python)
    BFC概念详解及应用
    做一个网页阅读百分比指示器
    margin-bottom和vertical-align的区别
    MD5算法
    Array.prototype.slice.call()方法详解
    String stringbuffer StringBuilder
    价值观
  • 原文地址:https://www.cnblogs.com/Lis-/p/12577243.html
Copyright © 2011-2022 走看看