Chinaunix首页 | 论坛 | 博客
  • 博客访问: 649259
  • 博文数量: 160
  • 博客积分: 2384
  • 博客等级: 大尉
  • 技术积分: 1366
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-01 11:35
文章分类
文章存档

2015年(45)

2014年(36)

2012年(28)

2011年(37)

2010年(2)

2009年(10)

2008年(2)

分类: C/C++

2014-11-14 12:42:02

7. 插入排序  Insertion Sort
    插入排序最好的运行时间是O(n),已经排序好了情况下,平均情况最情况都是O(n2),所以处理随机的未排序数据时并不是好的算法。
    通过将每个新元素与已经排序好的元素做比较,并将其插入到正确的位置来建立一个排序的数组,就像玩扑克一样,拿到新的牌放入到已经排序好的中间。
   插入排序是稳定的原地排序算法,特别适合对小的数据集合进行排序,通常作为其他更复杂的排序算法的构建模块。

点击(此处)折叠或打开

  1. void insertionSort(int *a, int len) {
  2.     for (int which=1; which<len; which++) {
  3.         int val = a[which];
  4.         for (int i=0; i<which; i++) {
  5.             if (a[i] > val) {
  6.                 // do shift to
  7.                 for (int j=which; j>i; j--) {
  8.                     a[j] = a[j-1];
  9.                 }
  10.                 a[i] = val;
  11.                 break;
  12.             }
  13.         }
  14.     }
  15. }
8. 位排序 Bit Sort
    用整数位的每一位来表示一个数字。详细参考《编程珠玑》。

点击(此处)折叠或打开

  1. #define BITSPERWORD 32
  2. #define SHIFT 5
  3. #define MASK 0x1F
  4. #define N 10000000
  5. int a[1 + N/BITSPERWORD];

  6. void set(int i) { a[i>>SHIFT] |= (1<<(i & MASK)); }
  7. void clr(int i) { a[i>>SHIFT] &= ~(1<<(i & MASK)); }
  8. int test(int i){ return a[i>>SHIFT] & (1<<(i & MASK)); }

  9. int main(void)
  10. { 
  11.     int i;
  12.     for (i = 0; i < N; i++)
  13.         clr(i);

  14.     while (scanf("%d", &i) != EOF)
  15.         set(i);
  16.     
  17.     for (i = 0; i < N; i++)
  18.         if (test(i))
  19.             printf("%d\n", i);

  20.     return 0;
  21. }

阅读(1344) | 评论(0) | 转发(1) |
0

上一篇:排序算法集合 -1

下一篇:查找算法

给主人留下些什么吧!~~