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

作者&投稿:豆卢飞 (若有异议请与网页底部的电邮联系)
~

排序 :将杂乱无章的数据,按照一定的方法进行排列的过程叫做排序。

排序大的分类可分为 内排序 外排序 ,不需要访问外存就能进行排序的叫做内排序。

排序也可以分为 稳定排序 不稳定排序

稳定排序 :假设在待排序的文件中,存在两个或两个以上的记录具有相同的关键字,在用某种排序法排序后,若这些相同关键字的元素的相对次序仍然不变,则这种排序方法是稳定的。即;若 a[i]=a[j] , a[i] a[j] 之前,经过排序后 a[i] 依然在 a[j] 之前。冒泡排序、直接插入排序、二分插入排序、归并排序,基数排序都是稳定排序。
不稳定排序 :直接选择排序、堆排序、快速排序、希尔排序,猴子排序。

以升序为例,比较相邻的元素,如果第一个比第二个大,则交换他们两个。如果两个元素一样大,则继续比较下一对。所以冒泡排序是一种稳定排序。

选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。快速排序是不稳定排序。

将序列分为两个部分{{有序序列},{无序}},每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。如果碰到相等的元素,就会把它插入到想等元素后面,顺序不会改变,所以直接插入排序是稳定排序。

在直接插入排序的基础上,对有序序列进行划分。例如:序列为 {{a[0]......a[i-1]},a[i]} 其中 {a[0]......a[i-1]} 为有序序列,取 a[(i-1)/2] ,将其与 a[i] 比较,即可确定 a[i] 的范围 (a[0]...a[(i-1)/2] 或者 a[(i-1)/2]...a[i-1]) ,然后继续在已确定的范围内进行二分。范围依次缩小为: 1/2、1/4、1/8、1/16...... 可快速确定a[i]应该插入的位置。二分插入排序也是稳定排序。

将整个序列分割成若干个小的子序列,每个子序列内分别进行插入排序。一般情况下步长取n/2。直到最后一次步长为1,即所有元素在一个组中进行排序。由于希尔排序是先将整个序列划分为多个子序列进行排序,相同的元素顺序在这个过程中顺序可能会被打乱,所以希尔排序是不稳定排序。

从待排序的数据元素中,选出最小或最大的元素与序列第一个数交换。直到所有数据排完。直接选择排序是不稳定排序。例如: {3,3,1} ,第一次排序就将1和第一个3交换,想等元素的顺序改变了。

以n=10的一个数组49, 38, 65, 97, 26, 13, 27, 49, 55, 4为例

堆排序是一种树形选择排序,是对直接选择排序的有效改进。
最大堆:每个节点的值都大于等于它的孩子节点。
最小堆:每个节点的值都小于等于它的孩子节点。
最大堆第0个数据是最大数,最小堆第0个数据是最小数。
堆排序是不稳定排序

思想

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
如何将两个有序序列合并?(升序)
{a[0]......a[i-1]},{b[0]......b[j-1]}
b[0]<a[0] ,取 b[0] 放入数组 c 中,然后继续比较数组 a b 中的第一个元素,直到数组 a b 中最后一对元素比较完成。

思想

将数组分成二组 a , b 如果这二组组内的数据都是有序的,那么就可以按照上述方法对这二组数据进行排序。如果这二组数据是无序的?
可以将 a , b 组各自再分成二组。递归操作,直到每个小组只有一个数据,每个小组只有一个元素所以我们可以认为它已经是有序序列,然后进行合并。
先分解后合并。
归并排序是稳定排序

将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。从最低位起从0-9依次扫描序列,一边扫描一边将扫描到的数据加到新的序列中,得到一个序列。然后比较高一位,重复上述操作,直到最高位排序完成。数列就变成一个有序序列。基数排序是稳定排序。

以全是二位数的序列举例

无限猴子定理 :指一只猴子随机在打字机键盘上按键,最后必然可以打出法国国家图书馆的每本图书。

时间复杂度最低1次,最高可执行到世界的尽头。。。




有哪些排序
3. 插入排序(Insertion Sort):插入排序将数组分为已排序和未排序两部分。通过将未排序部分的第一个元素与已排序部分中的元素进行比较和插入,逐渐扩大已排序部分,直到整个数组都排好序。4. 快速排序(Quick Sort):快速排序是一种高效的排序算法,基于分治思想。它将数组分成两个子数组,分别对其进行...

排序算法是怎样的?
二、知识剖析 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。 所以在面试中经常会问到排序算法及其相关的问题。但万变不离其宗,只要熟悉了思想,灵活运用也不是难事。一般在面试中最常考的是快速排序和冒泡排序,并且经常有面试官要求现场写出这两种...

排序算法概述
为了提升性能,有时我们在半子表的个数小于某个数(比如15)的情况下,对半子表的排序采用其他排序算法,比如插入排序。 若将两个有序表合并成一个有序表,称为2-路归并,与之对应的还有多路归并。 快速排序(Quicksort)是对冒泡排序的一种改进,也是采用分治法的一个典型的应用。 首先任意选取一个数据(比如数组的第...

列举常见的排序算法
一、冒泡排序 二、选择排序 三、插入排序 四、快速排序 五、堆排序 六、归并排序 七、基数排序 八、希尔排序 九、桶排序 十、二叉排序树排序

java中排序的时候是按什么排的?
在Java中,排序算法有很多种,每种算法都有不同的排序依据和规则。以下是一些常见的排序算法和它们的排序依据:1. 冒泡排序:基于相邻元素之间的相对位置,将较大的元素向上移动。2. 选择排序:基于最小\/最大元素的位置,将较小\/较大的元素放在前面。3. 插入排序:基于每个元素的位置,将其插入到已...

排序算法的排序算法
排序的算法有很多,对空间的要求及其时间效率也不尽相同。下面列出了一些常见的排序算法。这里面插入排序和冒泡排序又被称作简单排序,他们对空间的要求不高,但是时间效率却不稳定;而后面三种排序相对于简单排序对空间的要求稍高一点,但时间效率却能稳定在很高的水平。基数排序是针对关键字在一个较小范围...

几种常见的排序(冒泡、选择、插入、希尔、堆排序)
选择排序优缺点:优点:一轮比较只需要换一次位置; 缺点:效率慢,不稳定(举个例子5,8,5,2,9 我们知道第一遍选择第一个元素5会和2交换,那么原序列中2个5的相对位置前后顺序就破坏了)。直接插入排序算法(Stright Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表 中,...

各种排序算法实现和比较
然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。……直到无序区只有一个元素为止。(2)大根堆排序算法的...

常见查找和排序算法
计数排序不是比较排序,排序的速度快于任何比较排序算法。由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。比较适合用来排序==小范围非负整数数组的数组==。 桶排序是计数排序的升级版。它利用了函数的...

PHP实现常见的排序算法
接着再进行第二轮比较,但第二轮比较不必比较最后一个元素了,因为最后一个元素已经是最大的了。 第二轮比较结束后,第二大的数也会冒到倒数第二的位置。 依次类推,再进行第三轮,,, 就这样最大的数一直往后排(冒),最后完成排序。所以我们称这种排序算法为冒泡排序。选择排序是一种...

梅河口市15722953707: 几种常用的排序算法以及其时间复杂度 -
柯薇福里: 资料来源:https://zh.wikipedia.org/wiki/排序算法

梅河口市15722953707: C语言 各常见排序法的时间复杂度 急 请简单说明 -
柯薇福里: 选择排序抄算法复杂度是O(n^2). 插入排序是O(n^2) 快速排序快速排序是不稳2113定的.5261最理想情况算法时间复杂度O(nlog2n),最坏4102O(n^2). 堆排序算法时间复杂度O(nlogn). 归并1653排序的时间复杂度是O(nlog2n).

梅河口市15722953707: 各类排序的 时间复杂度 和 空间复杂的 还有稳定性 -
柯薇福里: 快速排序 O(nlog2n) 最差情况O(n^2) 选择排序 O(n^2) 冒泡排序 O(n^2) 插入排序 O (n^2)

梅河口市15722953707: 列举两种排序方式,并写出时间复杂度 -
柯薇福里: 常见排序方法:插入、交换、选择、合并等等.交换排序包含冒泡排序和快速排序.选择排序包含shaker排序和堆排序. 插入排序和冒泡排序又被称作简单排序,他们对空间的要求不高,但是时间效率却不稳定;而后面三种排序相对于简单排序对空间的要求稍高一点,但时间效率却能稳定在很高的水平.基数排序是针对关键字在一个较小范围内的排序算法.

梅河口市15722953707: 数据结构中排序方法有多少种
柯薇福里: 排序有5种; 1、插入排序(直接插入排序和希尔排序) 2、选择排序(直接选择排序和堆排序) 3、交换排序(冒泡排序和快速排序) 4、归并排序 5、基数排序 直接插入排序:逐个将后一个数加到前面的排好的序中.在直接插入排序过程中,...

梅河口市15722953707: JAVA中有哪几种常用的排序方法 -
柯薇福里: 1、冒泡排序 冒泡排序是一个比较简单的排序方法.在待排序的数列基本有序的情况下排序速度较快.若要排序的数有n个,则需要n-1轮排序,第j轮排序中,从第一个数开始,相邻两数比较,若不符合所要求的顺序,则交换两者的位置;直到第...

梅河口市15722953707: 快速排序法的平均时间复杂度和最坏时间复杂度分别是多少? -
柯薇福里: 快速排序的平均时间复杂度和最坏时间复杂度分别是O(nlgn)、O(n^2). 当排序已经成为基本有序状态时,快速排序退化为O(n^2),一般情况下,排序为指数复杂度. 快速排序最差情况递归调用栈高度O(n),平均情况递归调用栈高度O(logn),而...

梅河口市15722953707: 数据结构的排序方法有哪些? -
柯薇福里: 冒泡排序,快速排序,堆排序.冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要...

梅河口市15722953707: 几种常见的排序算法 -
柯薇福里: for(i = 0; i < n; i++) for(j = 0; j < n - 1 - i; j++){if(arr[j] arr[j + 1]){arr[j] = arr[j] ^ arr[j+1]; arr[j+1] = arr[j] ^ arr[j+1]; arr[j] = arr[j] ^ arr[j+1];}}} 交换两个数据,可以用用临时变量,也可用以下的两个方法a = a^b;b = a^b;a = a^b;或者 a = a + b;b = a - b;a = a - ...

梅河口市15722953707: 排序算法的排序算法 -
柯薇福里: 排序的算法有很多,对空间的要求及其时间效率也不尽相同.下面列出了一些常见的排序算法.这里面插入排序和冒泡排序又被称作简单排序,他们对空间的要求不高,但是时间效率却不稳定;而后面三种排序相对于简单排序对空间的要求稍高...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网