十大排序算法
- 、冒泡排序(Bubble Sort)
- 、选择排序(Selection Sort)
- 、插入排序(Insertion Sort)
- 、希尔排序(Shell Sort)
- 、归并排序(Merge Sort)
- 、快速排序(Quick Sort)
- 、堆排序(Heap Sort)
- 、计数排序(Counting Sort)
- 、桶排序(Bucket Sort)
以下算法时间复杂度O(n^2),空间复杂度O(1)
1.冒泡排序
从左至右,两两比较,保证大的在后面,否则换位。一次遍历后,某些大数被后置若干位,最大的被找出并排在最右侧。像冒泡一样。
多次遍历,才可正确排序,时间复杂度O(n^2)
实现方式:两层循环或者循环+递归
循环+递归
2.选择排序
冒泡排序
每次选择最小的放到最前面。
选择排序的优化,每次选择最大最小分别放到最左与最右。
3.插入排序
顺着选择排序想,可以得到插入排序。
构建新的序列,每次添加一个新的元素插入到当前序列中。
插入排序的优化
针对插入效率过低、数组插入元素慢的特点。
对于排好序的数组,新数字插入时,可使用二分法确定下次比较的位置。
新排序的结果使用链表存储。
4.希尔排序
插入排序的进阶版
分组进行插入排序,每次分组间隔变小,组内数量变多,最后一次排序为整体的插入排序
每次分组的间隔为n/2 -1,n为上次分组的长度。
思想:化远未近,减少内存消耗。先让序列整体大致有序,多次调整分组大小,使得序列更加有序。
希尔排序也称缩小增量排序
增量(间隔或分组长度)的选择是一个难题,没有准确的说法。
以下算法时间复杂度:O(nlogn)
5.快速排序
空间复杂度O(logn)
分治的思想
先从数列中任取出一个作为基准
大于该数的放到左边,小于该数的放到右边
对各个子区间执行上述操作,直到区间内元素个数小于2
代码实现:
双指针?一种实现方式
也可以不使用双指针
优化:每次选择合理的基准数,减少递归深度,结合插入排序,元素个数在10以内使用插入排序。
6.归并排序
空间复杂度O(n)
将两个有序数列合并成一个有序数列
将未排序数列看作n个有序数列,不断利用归并排序的思想,最总合并成一个数列。
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中的默认排序算法。
相比之下, TimSort 的最佳,平均和最坏情况综合起来最佳。在数据量比较少(<=64)的情况下,它直接用 Insert Sort,否则使用 MergeSort + BinarySearch 来提高排序效率

浙公网安备 33010602011771号