几种常见的排序算法概述

来源:互联网 发布:php看什么书 编辑:程序博客网 时间:2024/06/11 03:52
1.选择排序:先找到数组中最小的元素,之后与第一个元素交换位置。再将剩下的元素找到最小的,再与第二个元素交换位置,以此类推。
特点:运行时间与输入无关,数据移动是最少的
2.插入排序;相当于从第二个元素开始,分别看位置是否正确,如果不正确再与之前的移动
特点:插入排序对部分有序的数组十分有效,也比较适合小规模数组。
注:插入排序不会访问索引右侧的元素,而选择排序不会访问索引左侧的元素,因为插入排序不会移动比呗插入的元素更小的元素,所以他所需的比较次数平均只有选择排序的一半。
3.希尔排序:希尔排序的中心思想是使数组中任意间隔为h的元素都是有序的,也称为h有序数组,通俗的将就是比如说间隔是2,就第一个和第三个比较,第二个和第四个比较。
特点:希尔排序比插入排序和选择排序要快很多,并且数组越大,优势越大。
4.归并排序:要将一个数组排序,可以先(递归的)将它分成两半分别排序,然后将结果归并起来。
分类:自顶向下的归并排序和自底向上的归并排序
归并排序在最坏情况下的比较次数为~NloN,这是其他排序算法复杂度的上限,也就是说更好的算法需要保证使用的比较次数更少
优化:对排序来说,我们已经知道插入排序(或者选择排序)非常简单,因此很可能在小数组上比归并排序更快,因此可以使用插入排序处理小规模的子数组(比如长度小于15)一般可以将归并排序的运行时间缩短10%~15%。
5.快速排序:快速排序是一种分治的排序算法,他将一个数组分成两个子数组,将两部分独立的排序,快速排序和归并排序是互补的:归并排序将数组分成两个子数组分别排序,并将有序的子数组归并并且以将整个数组排序,而快速排序将数组排序的方式则是当两个子数组都有序时整个数组也就自然有序了。通俗的将就是选一个中间元素,让数组左边的元素都不大于中间元素,右边的元素都不小于中间元素。
改进:对于小数组,快速排序比插入排序慢
选择中间元素的时候最好采用三取样切分,选择一小部分元素的中位数来切分数组
将数组切分成三部分,防止元素相同的时候也需要进行排序,分别为大于,等于,小于。

原创粉丝点击