Chinaunix首页 | 论坛 | 博客
  • 博客访问: 261377
  • 博文数量: 84
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 927
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-06 23:00
个人简介

growing

文章分类

全部博文(84)

文章存档

2017年(6)

2016年(61)

2015年(17)

我的朋友

分类: C/C++

2016-04-10 14:25:44

1.计数排序
思路:相当于开个哈西表,表里存的是数字个数,数字做相对下标,以空间换时间。
特点:适合排范围集中的正数序列。
时间复杂度:O(n)
空间复杂度:O(1)

  1. void CountSort(int *a,size_t size)
  2. {
  3.     assert(a);
  4.     // 确定范围
  5.     int max = a[0],min = a[0];
  6.     for(size_t i = 0;i < size;++i)
  7.     {
  8.         if(a[i] > max)
  9.             max = a[i];
  10.         if(a[i] < min)
  11.             min = a[i];
  12.     }

  13.     int range = max - min +1;
  14.     int *CountArray = new int[range];
  15.     memset(CountArray,0,sizeof(int)*range);
  16.     for(size_t i = 0;i < size;++i)
  17.     {
  18.         CountArray[a[i] - min]++;
  19.     }
  20.     size_t index = 0;
  21.     for(size_t i = 0;i < range;++i)
  22.     {
  23.         if(CountArray[i] != 0)
  24.         {
  25.             while(CountArray[i])
  26.             {
  27.                 a[index++] = i + min;
  28.                 CountArray[i]--;
  29.             }
  30.         }
  31.     }
  32.     delete[] CountArray;
  33. }
2.基数排序(LSD从低到高)
LSD-- Least Significant Digit first
MSD-- Most Significant Digit first

原理:先排低位,将低位相同的放在同一个“桶"中,再排高位,数列即有序。


  1. void DigitSort(int *a, size_t size)
  2. {
  3.     int MaxDigit = GetMaxDigit(a, size);
  4.     int curDigit = 1;
  5.     int digit = 0;
  6.     int Count[10];
  7.     int *Start= new int[size];
  8.     int *Bucket = new int[size];
  9.     while (digit < MaxDigit)
  10.     {
  11.         memset(Count, 0, sizeof(int) * 10);
  12.         memset(Start, 0, sizeof(int) * 10);
  13.         for (int i = 0; i < size; ++i)
  14.         {
  15.             int num = a[i] / curDigit % 10;
  16.             Count[num]++;
  17.         }

  1.         for (int i = 1; i < 10; ++i)
  2.         {
  3.             Start[i] = Start[i - 1] + Count[i - 1];
  4.         }
  5.         for (int i = 0; i < size; ++i)
  6.         {
  7.             int num = a[i] / curDigit % 10;
  8.             Bucket[Start[num]++] = a[i];
  9.         }
  10.         memcpy(a, Bucket, sizeof(int)*size);
  11.         digit++;
  12.         curDigit *= 10;
  13.     }
  14.     delete[] Bucket;
  15.     delete[] Start;
  16. }



阅读(1095) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~