• 各种排序算法的总结


    稳定的排序:

    1、冒泡排序:

      工作原理:依次相邻元素进行比较,将小数放在前面,大数放在后面,每一次扫描是将最大的数放在最右边,每次扫描完之后,下次扫描的个数减一,知道所有的数都放好位置。即第一次扫描:比较第一个数和第二个数,判断大小,小数在前,大数在后,接着比较第二个数和第三个数,依次比较,知道最后一个数。此时最大的数在最后一个位置上了。第二次扫描:比较从第一个数和第二个数,判断大小,小数在前,大数在后,直到到倒数第二个数为止。同样的方法扫描n次。本质是每扫描一次就拍好了一个最大值的位置,故叫做冒泡排序。

    2、插入排序:

    工作原理:通过构建将整个待排序的序列分成有序序列和无序序列,从无序序列当中选择一个元素插入待有序序列中。这里需要注意的是,最初将整个序列的第一个数作为有序序列,后面n-1个数作为无序序列。从无序序列选择第一个数开始插入有序序列中,插入的方式是从右向左开始扫描有序序列,最右边的数是有序序列中最大的数,依次比较,待排序的数比已排好的数小,则将已排好的数往后移,最后找出待插入的数合适的位置插入。

    3、归并排序:

    工作原理:首先申请一个大小为两个待排序序列之和的空间,用来存放合并之后的序列。合并的方法是:分别设置两个指针,指针分别指向两个待排序的两个序列的第一个数。依次比较两个指针所指向的值的大小,将小的数放入申请的空间当中,以此类推。直到其中有一个指针到达序列的末尾。将剩下的另个序列的元素复制到申请的空间当中。

    4、桶排序:

    工作原理:给定一组数,将它们分成n等份范围的桶。即假设有100个数,则将它们分成10个区间大小相同的桶。然后分别对每个桶放入相应大小的元素,并进行桶内排序。最后按照桶顺序输出每个桶中的元素。其中桶内排序可以选择冒泡、插入、快拍都可以。

    5、基数排序

    工作原理:将一组待排序的数,找出最大值,根据最大值的位数,从低位到高位一次根据每位上的数分别放入0~9(十进制,若是二进制就是0~1)个桶当中,每次的按位排序之后的结果作为下一个高位排序的输入。即每一次排序可以通过递归来实现。

    不稳定的排序:

    1、选择排序:

    工作原理:首先将待排序的序列的第一个元素看作是已排好的数,通过将它跟后面的每一个数进行比较,判断大小,如果发现比它还小,则进行交换。每次扫描完之后,将最小的数放在最前面了。以此类推。直到所有的元素都放入正确的位置。

    此排序算法不稳定的原因是因为它存在隔数交换,也就是交换操作不是相邻元素交换而导致的不稳定。举个例子:假如待排序的元素:{2,2,1},第一次选择最小值后变成{1,2,2},对应的两个2的位置发生了变化。

    2、希尔排序:

    工作原理:希尔排序是插入排序的一种,是针对直接插入排序算法的改进。该方法又称缩小增量排序。

    按照不同的增量序列,对待排序的数组进行按照不同的增量方式来直接插入排序。直到增量值为1时就退化为直接插入排序了。

    本排序算法由于增量的改变,在插入时,存在非相邻元素的交换。因此是不稳定的。

    3、快速排序:

    工作原理:快排是对冒泡排序的一种改进。其工作原理:1)首先选择一个数作为基准,选择基准方式的不同可以对快排进行改进,当选择了基准之后,将基准和待排序序列的第一个元素进行交换,此时基准的位置是在第一个元素的位置上,为了方便后面的操作。2)从待排序的序列从右往左扫描,找出比基准小的数,将它与基准元素交换,也就是将后面大于基准的数放到最前面来,此时基准被交换到后面来了;3)然后从左向右扫描,找出比基准大的数,同样的跟基准交换,将大于基准元素放到后面来。重复这个过程,直到所有大于基准的元素放到基准的右边,小于基准元素放在基准的左边。最后将基准放在正确的顺序的位置上。每次过程完之后,都表明基准排序好了。然后基准左边的序列递归调用该过程,基准右边的序列递归调用该过程。直到所有元素都放入正确的位置。

    此算法同样存在非相邻元素之间的交换,因此本算法是不稳定的。

    4、堆排序:

    堆排序是利用最大堆(最小堆)记录最大关键字这一特性。具体步骤如下:

    1)首先初始化构建最大堆或者最小堆。所谓最大堆或者最小堆的结构就是该完全二叉树中,根节点是所有节点中最大值或者最小值。

    2)将堆顶元素(二叉树的根节点)与待排序序列最后一个元素交换,此时得到新的无序区1~n-1个元素,和有序区1个元素n。

    3)由于交换之后,无序区的序列可能违反了堆的性质(即堆顶元素是最大值或最小值)。因此需要对它进行调整(即通过比较所有的元素,将最大的元素放在堆顶,也就是序列的第一个元素的位置上)。调整之后将堆顶与最后一个元素n-1交换,得到新的无序区1~n-2个元素。和有序区2个元素n-1和n,不断地重复该过程,直到有序区的元素有n-1个,则整个排序过程完成。

    堆排序也是一种选择排序,是一种树形选择排序。由于每次交换也是菲林元素的交换,存在相同元素的位置发生变化。因此该算法也是不稳定的。

  • 相关阅读:
    开始写游戏 --- 第十一篇
    开始写游戏 --- 第十篇
    开始写游戏 --- 第九篇
    CDN的原理以及其中的一些技术
    深入理解Redis主键失效原理及实现机制
    使用 Redis 实现分布式系统轻量级协调技术
    Redis实现分布式锁
    进程线程协程
    类加载机制
    消息队列
  • 原文地址:https://www.cnblogs.com/ljy2013/p/3823483.html
Copyright © 2020-2023  润新知