排序算法稳定性

排序算法(一)冒泡排序

佐手、 提交于 2019-11-26 17:02:13
最基础的排序——冒泡排序 假设有无序数组array[]长度为n,以由小到大排序为例。冒泡的原理是这样的: 1.比较相邻的前两个数据,如果前面的数据array[0]大于后面的数据array[1] (为了稳定性,等于就不交换),将前面两个数据进行交换。在将计数器 i ++; 2.当遍历完n个数据一遍后,最大的数据就会沉底在数组最后array[n-1]。 3.然后n=n-1;再次进行遍历排序将第二大的数据沉到倒数第二位置上array[n-2]。再次重复,直到n=0;将所有数据排列完毕。 可以得出,冒泡在 n减到 0 为止,每遍近似遍历了n个数据。所以冒泡的时间复杂度是 -O(n^2)。 实现代码如下: public void sort (int[] array, int n) { int i = 0; int j = 0; int temp = 0; for(i = 0; i < n; i++){ for(j = 1; j < n - i; j++){ if(array[j - 1] > array[j]){ temp = array[j-1]; array[j - 1] = array[j]; array[j] = temp; } } } }   时间复杂度逻辑上是-O(n^2),所以冒泡还是效率比较低下的,数据较大时,建议不要采用冒泡。 来源: https://www.cnblogs

排序算法空间复杂度与时间复杂度总结

守給你的承諾、 提交于 2019-11-26 07:28:59
算法 空间复杂度 时间复杂度(平均/最坏) 稳定性 冒泡排序 O(1) O(n 2 )/O(n 2 ) 稳定 选择排序 O(1) O(n 2 )/O(n 2 ) 不稳定 插入排序 O(1) O(n 2 )/O(n 2 ) 稳定 希尔排序 O(1) O(nlogn)/O(n s ) (s为步长) 不稳定 快速排序 O(logn) O(n*logn)/O(n 2 ) 不稳定 归并排序 O(n) O(nlogn)/O(nlogn) 稳定 堆排序 O(1) O(nlogn)/O(nlogn) 不稳定 时间复杂度 :是同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。 计算机科学中, 算法的时间复杂度是一个函数,它定性描述了该算法的运行时间 。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。 空间复杂度 :是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息

十大经典排序算法的算法描述和代码实现

谁说胖子不能爱 提交于 2019-11-26 04:48:51
这里详细讲解了十大经典算法的分类,例如交换排序、插入排序、选择排序等比较类排序,以及计数排序、桶排序和基数排序的非比较类排序,分析了各种排序算法的复杂度和稳定性,还有JAVA代码的详细实现。对冒泡排序、插入排序、选择排序和堆排序等十种算法进行了详细的思想总结。 一、算法概述 1、算法分类 十种常见排序算法可以分为两大类: (1)比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn)因此也称为非线性时间比较类排序。 (2)非比较类排序:不通过比较元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 2、算法复杂度 3、相关概念 (1)稳定 如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 (2)不稳定 如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。 (3)时间复杂度 对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。 (4)空间复杂度 是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。 二、排序算法的代码实现 1、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成

排序学习笔记

风流意气都作罢 提交于 2019-11-25 21:49:21
文章目录 1、如何分析一个“排序算法”? 1.1 排序算法的执行效率 1.2 排序算法的内存消耗 1.3 排序算法的稳定性 2、复杂度O(n2)的排序 2.1 冒泡排序(Bubble Sort) 2.2 插入排序(Insertion Sort) 2.3 选择排序(Selection Sort) 2.4 三种排序对比图 2.5 为什么插入排序要比冒泡排序更受欢迎呢? 3、复杂度O(nlogn)的排序 3.1 归并排序 3.2 快速排序 3.3 三种比较 4、复杂度O(n)的排序 4.1 桶排序(Bucket sort) 4.2 计数排序(Counting sort) 4.3 基数排序(Radix sort) 1、如何分析一个“排序算法”? 1.1 排序算法的执行效率 最好情况、最坏情况、平均情况时间复杂度 时间复杂度的系数、常数 、低阶 比较次数和交换(或移动)次数 1.2 排序算法的内存消耗 1.3 排序算法的稳定性 ​ 如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。 2、复杂度O(n2)的排序 2.1 冒泡排序(Bubble Sort) // 冒泡排序,a 表示数组,n 表示数组大小 public void bubbleSort ( int [ ] a , int n ) { if ( n <= 1 ) return ; for ( int i