——排序算法

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.代码实现:

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值