排序算法集合 -3

1490阅读 0评论2014-11-14 mandagod
分类:C/C++

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

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