您的位置:首页 > 其它

排序算法大总结

2012-09-23 00:47 211 查看
好的我们先来看下排序算法的大结构

1.交换排序法

冒泡排序 |
鸡尾酒排序 | 奇偶排序
| 梳排序 |
侏儒排序 | 快速排序
|臭皮匠算法 |
Bogo排序
2.选择排序法

选择排序 |
堆排序 | Smooth排序
| 笛卡尔树排序 |
锦标赛排序 |
循环排序
3.插入排序法

插入排序 |
希尔排序 | 二叉查找树排序
| 图书馆排序 |
Patience排序
4.归并排序法

归并排序 |
多相归并排序 |
Strand排序
5.分布排序法

美国旗帜排序
| 珠排序 |
桶排序 | 爆炸排序
| 计数排序 |
鸽巢排序 | 相邻图排序
| 基数排序 |
闪电排序
6.混合排序法

Tim排序 |
内省排序 | Spread排序
| 反移排序 |
J排序
其他

双调排序器
| Batcher归并网络 |
两两排序网络

我们来看下网易的一道排序算法题:

(单选)最坏情况下时间复杂度不是n(n-1)/2的排序算法是:

A.快速排序 B.冒泡排序
C.直接插入排序
D.堆排序

排序算法的考点主要倾向于稳定性,跟算法时间复杂度的计算。

(ps:说到算法时间复杂度,很多人连时间复杂度都不懂,这样的程序员一抓一大把,他们也有自己的理由,现在硬件是这么强悍。。。)

我们这次教程不面向初学者,只对有经验的程序。

一。插入排序

直接插入排序

很多学直接插入排序的人来说,插入排序我觉得关键是哨兵的作用。

也就是那第一个临时变量。

我们来看下直接插入排序的代码:

#include
<iostream>

#include
<regex>

using
namespace std;

const
int len = 8;

/*

*
插入排序

*/

void
sortinsert(int r[])

{

int
j = 0;

for(int
i=2;i<len;i++)

{

if(r[i]<r[i-1])

{

r[0]
= r[i]; //设置哨兵

for(
j=i-1;r[j]>r[0];j--)

{

r[j+1]
= r[j];

}

r[j+1]
= r[0];

}

}

}

int
main()

{

//0
1 2 3 4

int
a[] = {0,5,3,6,1,2,7,4};

sortinsert(a);

for(int
i=1;i<len;i++)

{

cout<<a[i]<<endl;

}

return
0;

}

插入排序的时间复杂度是多少?最坏情况是多少?
最好情况士多少?0他是稳定的多少?

如果你不能直接想出来,那说明,你并没有理解这个算法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: