计数排序及拓展

  1. 在字符串中找出第一个只出现一次的字符。(35)
  2. 对公司员工的年龄进行统计排序。
  3. 计数排序(适用于有边界的数值统计)。

1、思路:

  因为字符只有256个数字,设置一个hashtable只有256*4=1K字节,这样时间复杂度只有O(n)。

《计数排序及拓展》
《计数排序及拓展》
FirstNotRepeatingChar

 1 char FirstNotRepeatingChar(char* pString)
 2 {
 3     if(pString == NULL)
 4         return '\0';
 5 
 6     const int tableSize = 256;
 7     unsigned int hashTable[tableSize];
 8     for(unsigned int i = 0; i<tableSize; ++ i)
 9         hashTable[i] = 0;
10 
11     char* pHashKey = pString;
12     while(*(pHashKey) != '\0')
13         hashTable[*(pHashKey++)] ++;
14 
15     pHashKey = pString;
16     while(*pHashKey != '\0')
17     {
18         if(hashTable[*pHashKey] == 1)
19             return *pHashKey;
20 
21         pHashKey++;
22     }
23 
24     return '\0';
25 } 

 

2、思路:

  构建hash,key:age->value:num。根据key值大小排序。

《计数排序及拓展》
《计数排序及拓展》
SortAges

 1 #include <stdio.h>
 2 #include <exception>
 3 
 4 void SortAges(int ages[], int length)
 5 {
 6      const int oldestAge = 99;
 7      int hashTable[oldestAge + 1];
 8      for (int i = 0; i <= oldestAge; i++)
 9          hashTable[i] = 0;
10 
11      for (int i = 0; i < length; i++)
12      {
13          int age = ages[i];
14          if (age < 0 || age > oldestAge)
15              throw new std::exception();
16          hashTable[age]++;
17      }
18 
19      int index = 0;
20      for (int i = 0; i <= oldestAge; i++)
21      {
22          for (int j = 0; j < hashTable[i]; j++)
23          {
24              ages[index] = i;
25              index ++;
26          }
27      }
28 }
29 
30 int main()
31 {
32     int ages[] = {17, 23, 12, 23, 45, 88, 45, 23};
33     SortAges(ages, 8);
34     for (int i = 0; i < 8; i++)
35         printf("%d ", ages[i]);
36     printf("\n");
37 }

 

 3、思路:

  相当于大数据中分区段统计一样。

《计数排序及拓展》
《计数排序及拓展》

 1 void CounterSort(string str, string &help_str)  
 2 {  
 3     // 辅助计数数组   
 4     int help[26] = {0};  
 5   
 6     // help[index]存放了等于index + 'A'的元素个数   
 7     for (int i = 0; i < str.length(); i++)  
 8     {  
 9         int index = str[i] - 'A';  
10         help[index]++;  
11     }  
12   
13     // 求出每个元素对应的最终位置   
14     for (int j = 1; j < 26; j++)  
15         help[j] += help[j-1];  
16   
17     // 把每个元素放到其对应的最终位置   
18     for (int k = str.length() - 1; k >= 0; k--)  
19     {  
20         int index = str[k] - 'A';  
21         int pos = help[index] - 1;  
22         help_str[pos] = str[k];  
23         help[index]--;  
24     }  
25 }  

CounterSort

 

    原文作者:算法小白
    原文地址: https://www.cnblogs.com/wangpengjie/archive/2013/03/27/2984582.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注