排序算法大总结

 


好的我们先来看下排序算法的大结构



1.
交换排序法    
冒泡排序 | 鸡尾酒排序 | 奇偶排序 | 梳排序 | 侏儒排序 | 快速排序 |臭皮匠算法 | Bogo排序
2.
选择排序法    
选择排序 | 堆排序 | Smooth排序 | 笛卡尔树排序 | 锦标赛排序 | 循环排序
3.
插入排序法    
插入排序 | 希尔排序 | 二叉查找树排序 | 图书馆排序 | Patience排序
4.
归并排序法    
归并排序 | 多相归并排序 | Strand排序
5.
分布排序法    
美国旗帜排序 | 珠排序 | 桶排序 | 爆炸排序 | 计数排序 | 鸽巢排序 | 相邻图排序 | 基数排序 | 闪电排序
6.
混合排序法    
Tim
排序 | 内省排序 | Spread排序 | 反移排序 | J排序
其他    
双调排序器 | Batcher归并网络 | 两两排序网络


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


  1. (单选)最坏情况下时间复杂度不是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他是稳定的多少?



如果你不能直接想出来,那说明,你并没有理解这个算法



posted @ 2012-09-23 00:47  pipicfan  阅读(407)  评论(0编辑  收藏  举报