十大排序算法

  1. 、冒泡排序(Bubble Sort)
  2. 、选择排序(Selection Sort)
  3. 、插入排序(Insertion Sort)
  4. 、希尔排序(Shell Sort)
  5. 、归并排序(Merge Sort)
  6. 、快速排序(Quick Sort)
  7. 、堆排序(Heap Sort)
  8. 、计数排序(Counting Sort)
  9. 、桶排序(Bucket Sort)

以下算法时间复杂度O(n^2),空间复杂度O(1)

1.冒泡排序

从左至右,两两比较,保证大的在后面,否则换位。一次遍历后,某些大数被后置若干位,最大的被找出并排在最右侧。像冒泡一样。

多次遍历,才可正确排序,时间复杂度O(n^2)

实现方式:两层循环或者循环+递归

循环+递归

image-20220419101813044

2.选择排序

冒泡排序

每次选择最小的放到最前面。

选择排序的优化,每次选择最大最小分别放到最左与最右。

3.插入排序

顺着选择排序想,可以得到插入排序。

构建新的序列,每次添加一个新的元素插入到当前序列中。

插入排序的优化

针对插入效率过低、数组插入元素慢的特点。

对于排好序的数组,新数字插入时,可使用二分法确定下次比较的位置。

新排序的结果使用链表存储。

4.希尔排序

插入排序的进阶版

分组进行插入排序,每次分组间隔变小,组内数量变多,最后一次排序为整体的插入排序

每次分组的间隔为n/2 -1,n为上次分组的长度。

思想:化远未近,减少内存消耗。先让序列整体大致有序,多次调整分组大小,使得序列更加有序。

希尔排序也称缩小增量排序

增量(间隔或分组长度)的选择是一个难题,没有准确的说法。


以下算法时间复杂度:O(nlogn)

5.快速排序

空间复杂度O(logn)

分治的思想

先从数列中任取出一个作为基准

大于该数的放到左边,小于该数的放到右边

对各个子区间执行上述操作,直到区间内元素个数小于2

代码实现

双指针?一种实现方式

也可以不使用双指针

优化:每次选择合理的基准数,减少递归深度,结合插入排序,元素个数在10以内使用插入排序。

6.归并排序

空间复杂度O(n)

将两个有序数列合并成一个有序数列

image-20220419114659455

将未排序数列看作n个有序数列,不断利用归并排序的思想,最总合并成一个数列。

image-20220419114420344

7.堆排序

空间复杂度O(1)

利用完全二叉树的结构进行排序

大顶堆、小顶堆

流程:

初步构建树

构建大顶堆/小顶堆

右下角数字与最大值交换位置,该数下沉,下沉过程中为重新构建大顶堆的过程

右下角开始,从右往左,从下往上重复上述过程,最终得到排序后的结果,从上往下,从左往右依次递增。


以下算法时间复杂度O(n+k),空间复杂度O(n+k)

8.计数排序

利用先验,提前知道有那些数字,处在哪个区间,利用空间换取时间。

将可能的结果区间按照顺序排序,出现一次,计数器加一,只需遍历一次。

排序的元素必须是整数,取值在一定范围,适合用计数排序

9.桶排序

只是一种分治的思想

将数据按照大小分到不同的区间,在不同区间使用多进程,以上述几种算法排序,最后按序合并。

每个桶使用链表进行排序,避免内存浪费。

设计时,将数据分布变得均匀。发挥其效率。

10.基数排序

先按照个位排序,个位变得有序

再按照十位排序,十位变得有序。同时个位排过序,按十位分桶时,个位也是有序的。

再按照百位排序,百位变得有序。。。

最快的排序算法是什么,很多人的第一反应是快排,感觉QuickSort 当然应该最快了,其实并非如此,快排是不稳定的,最坏情况下,快排序并不是最优,Java7 中引入的 TimSort 就是一个结合了插入排序和归并排序的高效算法.,Timsort最早是 Tim Peters 于2001年为 Python 写的排序算法。自从发明该算法以来,它已被用作Python,Java,Android平台和GNU Octave中的默认排序算法。

img

相比之下, TimSort 的最佳,平均和最坏情况综合起来最佳。在数据量比较少(<=64)的情况下,它直接用 Insert Sort,否则使用 MergeSort + BinarySearch 来提高排序效率

posted @ 2022-05-23 22:39  killens  阅读(124)  评论(0)    收藏  举报