好的我们先来看下排序算法的大结构
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他是稳定的多少?
如果你不能直接想出来,那说明,你并没有理解这个算法