Chinaunix首页 | 论坛 | 博客
  • 博客访问: 98375
  • 博文数量: 22
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-17 11:22
文章分类

全部博文(22)

文章存档

2015年(6)

2014年(16)

我的朋友

分类: C/C++

2014-11-16 22:10:31

原文地址:排序算法集合 -3 作者:mandagod

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. }

阅读(1403) | 评论(0) | 转发(0) |
0

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

下一篇:C语言之内存分配

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