目录
2、常见数据结构排序算法的时间复杂度、空间复杂度、稳定性介绍如下图所示:
一、数据结构的八大排序算法总结笔记:
1、常见的数据结构排序算法如下图所示:
2、常见数据结构排序算法的时间复杂度、空间复杂度、稳定性介绍如下图所示:
二、排序算法逐一介绍:
1、直接插入排序:
(1)排序原理及方法:
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果新元素小于已排序元素tmp<array[ j ],将该元素移到下一位置array[ j+1]=array[ j ]
- 重复步骤3 j - -,直到找到已排序的元素小于或者等于新元素的位置 array[ j ]<=tmp
- 将新元素tmp插入到该位置 array[ j+1] = tmp
- 重复步骤2~5
(2)排序方法图解:
(3)算法效率:
平均时间复杂度 | 最好时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 稳定性 |
O(N^2) | O(N) | O(N^2) | O(1) | 稳定 |
- 平均时间复杂度:O(N^2) 两个for循环嵌套
- 最好时间复杂度:O(N) 有序时,j不需要回退,只剩下一个for循环
2、希尔排序
(1)排序原理及方法:
- 第一趟增量序列为5,把待排序列分割为5个的子序列(第一个子序列从第一个元素开始,相隔5个元素,取下一个元素,直到取不够5个间隔的元素为止),其中每个子序列包含2个元素,分别对这5个子序列进行直接插入排序。
- 第二趟增量序列为2,把待排序列分割为2个的子序列(第一个子序列从第一个元素开始,相隔2个元素,取下一个元素,直到取不够2个间隔的元素为止),其中每个子序列包含5个元素,分别对这2个子序列进行直接插入排序。
- 最后一趟增量序列为1,待排序列整体进行直接插入排序,最后一趟数据已经基本有序,效率很高。
(2)排序方法图解:
(3)算法效率:
平均时间复杂度 | 最好时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 稳定性 |
O(nlogn) | O(n^1.3) | O(n^2) | O(1) | 不稳定 |
3、简单选择排序
(1)排序原理及方法:
从待排序列中第一个元素(i=0)开始,与下一个元素(j=i+1)进行比较,如果比第二个元素小,则交换位置,直到 j 向后走到数组最后一个元素,开始第二趟排序,这样就确定了最小的元素
第二趟排序从第二个元素(i=1)开始,与下一个元素(j=i+1)进行比较,如果比第二个元素小,则交换位置,这样就确定了数组中第二小的元素
以此类推,每一趟排序可以确定一个元素的位置,即最小的元素,第二小元素,第三小元素.....
(2)排序方法图解:
(3)算法效率:
平均时间复杂度 | 最好时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 稳定性 |
O(N^2) | O(N^2) | O(N^2) | O(1) | 不稳定 |
- 最坏时间复杂度:O(N^2) 无论是否有序,都必须进行两层for循环进行比较
4、冒泡排序
(1)排序原理及方法:
第一趟从第一个元素array[0]开始,与下一个元素array[1]进行比较,如果array[1]小于array[ 0],则交换位置,然后比较array[1]和array[ 2],如果array[1]小于array[ 2],则交换位置,以此类推,直到比较完全部元素,就确定了最大元素
第二趟从第一个元素array[0]开始,与下一个元素array[1]进行比较,依次两组元素进行比较,直到比较完除了最后一个元素的全部元素,这样就确定了第二大元素
每一趟比较结束,就依次确定了最大元素,第二大元素,第三大元素...
(2)排序方法图解:
(3)算法效率:
平均时间复杂度 | 最好时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 稳定性 |
O(N^2) | O(N) | O(N^2) | O(1) | 稳定 |
- 最好时间复杂度:O(N) 数据有序的情况下,不需要交换数据,即内部for循环复杂度为O(1)
5、快速排序
(1)排序原理及方法:
从数列中挑出一个元素,称为"基准"(pivot)。
重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。
(2)排序方法图解:
(3)算法效率:
平均时间复杂度 | 最好时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 稳定性 |
O(nlogn) | O(nlogn) | O(N^2) | O(logn)~ O(n) | 不稳定 |
最好时间复杂度:当每次划分时,算法若都能分成两个等长的子序列时,分治算法效率达到最大
最坏时间复杂度:待排序列有序时,相当于冒泡排序,递归实现会出现栈溢出的现象,时间复杂度为O(N^2)
最好空间复杂度:每次都把待排序列分为相等的两部分,2^x=n (分割x次,保存x个par) ,x = logn
最坏空间复杂度:1 2 3 4 5 6 7 N个数据就保存N个par
6、归并排序
(1)排序原理及方法:
- 把待排序列递归的分为长度相等的两个子序列,直到分解为1个子序列中包含1个元素为止
- 递归的将每两个子序列合并为一个有序子序列
- 最终合并的序列即为有序序列
(2)排序方法图解:
(3)算法效率:
平均时间复杂度 | 最好时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 稳定性 |
O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 |
7、堆排序
(1)排序原理及方法:
- 将待排序序列构造成一个大顶堆
- 此时,整个序列的最大值就是堆顶的根节点。
- 将其与末尾元素进行交换,此时末尾就为最大值。
- 然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。
- 可以看到在构建大顶堆的过程中,元素的个数逐渐减少,最后就得到一个有序序列了.
(2)排序方法图解:
(3)算法效率:
堆排序 堆排序 | O(n*logn) 不稳定 |
8、基数排序
(1)排序原理及方法:
将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,
数列就变成一个有序序列。
(2)排序方法图解:
(3)算法效率:
平均时间复杂度 | 最好时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 稳定性 |
基数排序是经典的空间换时间的排序方法,当数据量过大时,容易造成内存溢出