1.插入排序——经典插入排序
1.原理:在已经有序的序列中插入一个数使其仍然有序,一开始有序序列是第一个数,随着不断插入将整个序列置为有序.
2.代码实现:
3.时间复杂度:O(N^2)
2.插入排序——希尔排序
1.引子:在使用插入排序时,如果要排序的序列是这样的情况:前半部分大多都是大值,后半部分大多都是小值,而我们要把它排成升序序列。这样基本每次插入后面的值时都要把前面的值挪动一次,很费时间,而希尔排序解决了这个问题
2..原理:
从头开始取这个序列中的几个数据,这几个数据之间的间隔为gap,并把取出来的序列记作L1。如果gap取一个尽可能大的值,然后对L1插入排序,这样使得较大或较小的数更快的向前或后挪动。为了一次性处理更多的数据(使其最大程度接近有序),下一步就是从L1的开始位置的下一个位置开始,取间距为gap的几个数据,组成序列L2,对L2也插入排序。重复这个操作直到开始位置不小于gap或者开始位置的下gap个位置不存在为止。
示意图如下:
也有可能是:
c,d没排也没事,我们只是让它接近有序。
到这儿没有结束,gap>1的好处就是每次挪动步子更大,所以我们让gap取值逐渐变小最后为1,重复上面的步骤,gap为1就是正常的插入排序了
3.代码实现:
4.时间复杂度:O(N^1.3);
3.选择排序
1.原理:left开始为0,right开始为n-1,遍历【left-right】之间的数组找出最大值最小值并分别赋给left,right,然后把left++,right--,再次找最大值和最小值并给left和right赋值,多次进行直到left遇到right.
2.代码实现.
3.时间复杂度:O(N^2),交换次数少所以比冒泡好一点
4.选择排序-堆排序
1.利用堆的性质,每次用堆选出最值放到最后一位,然后将堆数量减一.升序用大堆,降序用小堆.
2.代码实现:
3.时间复杂度:O(N*logN)
5.交换排序-冒泡排序
1.原理:每次找出最值放到最后
2.代码:
3.复杂度:O(N^2)
5.交换排序-快速排序
1.原理:使用分治的思想,将小于key的数放在key的左边,大于key的放右边.
2.代码实现:
hoare版本:
前后指针版本:
把pev想象成大于key的值和小于key的值的分界点,cur用来遍历整个序列,<=pev的都小于等于key,>pev都大于key,最后把pev遇key互换.
3.时间复杂度:O(N^logN)
6交换排序-非递归快速排序
1.原理:利用栈空间将范围存起来
2.代码实现:
7.归并排序-递归
1.原理:将给定序列分而治之,自下而上合并有序序列.
2.代码实现:
3.复杂度:O(N*logN)
8.归并排序-非递归
1.原理:利用循环,随着有序区间不断扩大,将有序区间与有序区间合并,最终合并整个区间.
2.代码实现: