各种排序算法的稳定性以及时间和空间复杂度分析

1、稳定性

  ①冒泡排序

    比较是两个相邻的元素比较,交换是两个相邻的元素交换。所以如果两个元素相等,就不用无聊地去交换吧,这样也能减少交换次数。所以冒泡排序是稳定的。

  ②选择排序

    选择排序是每次给第一个位置选第一小的,给第二个位置选第二小的,以此类推.....。所以说两个相等的元素可能因为选择第一个小的就会被打乱顺序。例如5 8 5 2,这四个元素选第一小的2的时候会把5放入放入2的原位置,导致两个5相对顺序变化,所以不稳定。

  ③插入排序

    插入排序是在已经有序的小序列的基础上排序的。排序的规则是:有序小序列后的第一个元素和有序中的最大的比,比他大的直接插入其后,比他小的往前找。相等的话直接插入该元素之后。所以插入排序是稳定的。

  ④快速排序

    快速排序有两个方向,左边的i下标一直往右走,右边的j下标一直往左走。i<=j 交换A[i]和A[j],如果i>j,交换A[j]和枢轴元素,完成一趟快排。不稳定。

  ⑤归并排序

    归并排序是把序列递归地分成短序列,递归出口是短序列只有1个元素(认为直接有序)或者2个序列(1次比较和交换),然后把各个有序的短序列合并成一个有序的长序列,不断合并直到原序列全部排好序。可以发现,在1个或2个元素时,1个元素不会交换,2个元素如果大小相等也没有人故意交换,这不会破坏稳定 性。那么,在短的有序序列合并的过程中,稳定是是否受到破坏?没有,合并过程中我们可以保证如果两个当前元素相等时,我们把处在前面的序列的元素保存在结 果序列的前面,这样就保证了稳定性。所以,归并排序也是稳定的排序算法。

  ⑥基数排序

    稳定。

  ⑦希尔排序

    不稳定。有自己的步长。

  ⑨堆排序

    不稳定。

时间: 2024-10-23 01:24:51

各种排序算法的稳定性以及时间和空间复杂度分析的相关文章

转:各种排序算法的稳定性和时间复杂度小结

选择排序.快速排序.希尔排序.堆排序不是稳定的排序算法, 冒泡排序.插入排序.归并排序和基数排序是稳定的排序算法. 冒泡法:  这是最原始,也是众所周知的最慢的算法了.他的名字的由来因为它的工作看来象是冒泡:  复杂度为O(n*n).当数据为正序,将不会有交换.复杂度为O(0). 直接插入排序:O(n*n) 选择排序:O(n*n) 快速排序:平均时间复杂度log2(n)*n,所有内部排序方法中最高好的,大多数情况下总是最好的. 归并排序:log2(n)*n 堆排序:log2(n)*n 希尔排序:

排序算法的稳定性

首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同.在简单形式化一下,如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前. 其次,说一下稳定性的好处.排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用.基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的.另外,如果排序算法稳定,对基于比较的排序算法而言,

各种排序算法的稳定性和时间复杂度小结

选择排序.快速排序.希尔排序.堆排序不是稳定的排序算法, 冒泡排序.插入排序.归并排序和基数排序是稳定的排序算法. 冒泡法:  这是最原始,也是众所周知的最慢的算法了.他的名字的由来因为它的工作看来象是冒泡:  复杂度为O(n*n).当数据为正序,将不会有交换.复杂度为O(0). 直接插入排序:O(n*n) 选择排序:O(n*n) 快速排序:平均时间复杂度log2(n)*n,所有内部排序方法中最高好的,大多数情况下总是最好的. 归并排序:log2(n)*n 堆排序:log2(n)*n 希尔排序:

内部排序算法的稳定性

1.排序 排序是计算机程序设计中的一个重要操作,因此学习和研究各种排序算法是一个重要的课题. 2.排序种类 根据排序记录的数量和排序过程中的存储器不同,可以将排序分为内部排序和外部排序. 内部排序:指的是将带排序记录存放到计算机内存中进行排序的过程. 外部排序:指的是带排序的记录数量很大,以至于内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程. 3.排序稳定性 关于排序的稳定性:如果排序前2个相等的数在序列的前后位置顺序和排序后它们两个的前后位置顺序相同,就是稳定的排序,否则就

算法 - 排序算法的稳定性

排序算法的稳定性 排序的稳定性,指原有数据相同值的原始次序不变. 可以: 冒泡排序遇到相等的数不交换即可做到稳定. 插入排序,遇到相等的数即停止比较,插入数组. 归并排序 merge 过程中,遇到相等的值先填入左区域的值就可以做到稳定. 不可以: 选择排序不能做到稳定性,选择数值的时候交换数字是会打乱原始的次序. 随机快排不具有稳定性,因此荷兰国旗问题也是不能做到稳定性的. 堆排序. 稳定性的意义: 现实工程中需要保持上一次排序时遗留的信息,比如学校的成绩排序,第一次查询以成绩高低排序,第二次查

各种排序算法的稳定性分析

(1)冒泡排序 冒泡排序就是把小的元素往前调或者把大的元素往后调.比较是相邻的两个元素比较,交换也发生在这两个元素之间.所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的:如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法. (2)选择排序 选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个

常见排序算法及对应的时间复杂度和空间复杂度

转载请注明出处: http://blog.csdn.net/gane_cheng/article/details/52652705 http://www.ganecheng.tech/blog/52652705.html (浏览效果更好) 排序算法经过了很长时间的演变,产生了很多种不同的方法.对于初学者来说,对它们进行整理便于理解记忆显得很重要.每种算法都有它特定的使用场合,很难通用.因此,我们很有必要对所有常见的排序算法进行归纳. 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记

比较排序算法的简单介绍和复杂度分析

标题长坑,就拿最近有在用的来弄吧,先写个大概,以后逐渐完善. 对于以下代码,默认包含头文件: #include<algorithm> 1.冒泡排序(Bubble Sort) 先从课本上最常见的冒泡排序说起吧,C++代码如下(个人习惯介绍算法使用C++,比伪代码还通俗易懂.......) void BubbleSort(int *A, int n) { for (int i = 0;i < n;++i)//遍历数组 { for (int j = n - 1;j > i;--j)//倒

八大排序算法——冒泡排序(动图演示 思路分析 实例代码java 负杂度分析)

一.动图演示 二.思路分析 1.  相邻两个数两两相比,n[i]跟n[j+1]比,如果n[i]>n[j+1],则将连个数进行交换, 2.  j++, 重复以上步骤,第一趟结束后,最大数就会被确定在最后一位,这就是冒泡排序又称大(小)数沉底, 3.  i++,重复以上步骤,直到i=n-1结束,排序完成. 三.负杂度分析 1.  不管原始数组是否有序,时间复杂度都是O(n2), 因为没一个数都要与其他数比较一次,(n-1)2次,分解:n2+2n-1,  去掉低次幂和常数,剩下n2,所以最后的时间复杂