5.计数排序

 1 #include "pch.h"
 2 #include <iostream>
 3 //计数排序,本质和桶排序一样
 4 //该方法的思想是构造一个简单哈希表H(key)=key(由于对哈希表的查询等操作不作要求,这里使用简单的排解冲突方式)
 5 //实际上你根本不需要构造所谓的哈希表,然后排解冲突,你只是需要统计count就可以了,这里只是简单的练习一下
 6 //构造count[]用于计算每个关键码的个数
 7 //构造accum[]计算前n个关键码的累加值
 8 //比如说count[3]={1,2,3};则accum[3]={1,3,6; accum[0]=count[0],accum[i]=accum[i]+count[i-1]
 9 //那么从这两个数组就可以知道每一个关键码的的序列和个数了,上述数组就可以知道0有一位,且排在第一位
10 //再如1有两位,他应该排在0的后accum[1]-accum[0]位,你也许觉得拿count一个数组不是也能实现这样了吗?
11 //确实是可以这样做的,实际上下面的代码也是这么做的,这里只是做点额外的分析而已,并且
12 //计数排序是更简单的,开辟的空间大小应当由序列中的最大值和最小值决定O(Max-Min)
13 //这里单纯是自己的胡思乱想和想复习一下哈希表的冲突排解方法和一些存储方法
14 const int MaxSize = 101;
15 int count[MaxSize] = { 0 };
16 int accum[MaxSize] = { 0 };
17 //构造一个简单的散列表
18 //开放地址法排解冲突
19 void Insert(int arr[],int data) {
20     int temp = data;
21     if(arr[data]==0)                    //默认0不参与排序,你总需要一个空桶标志
22     arr[data] = data;                   //哈希函数和解决冲突的函数不再单独封装,实际上分开会更清晰点
23     else {
24         do
25         {
26             data = (data + 1) % MaxSize;
27         } while (arr[data]!=0);
28         arr[data] = temp;
29     }
30     count[temp]++;                       //计数数组累加
31 }
32 void Accum() {                           //累计数组计算(积分)
33     accum[0] = count[0];
34     for (int i = 0; i<MaxSize; i++) {
35         if(count[i+1]>0)
36         accum[i + 1] = accum[i] + count[i + 1];
37     }
38 }
39 void bucketSort(int arr[],int n) {
40     int ARR[MaxSize] = { 0 };
41     for (int k = 0; k < n; k++) {    //把数组的元素存放在哈希表中
42         Insert(ARR, arr[k]);
43     }
44     Accum();                         //计算accum数组
45     for (int i = 0,z=0; i < MaxSize; i++) {
46         if (count[i] > 0) {
47             for (int j = 0; j < count[i]; j++)
48                 arr[z++] = i;
49         }
50     }
51     
52 }
53 int main() {
54     int a[10] = { 15,65,47,85,90,13,15,14,16,75 };
55     bucketSort(a, 10);
56     for (int i = 0; i < 10; i++) {
57         std::cout << a[i] << " ";
58 
59     }
60 }

 

posted @ 2019-11-12 15:11  Royzzzzz  阅读(91)  评论(0编辑  收藏  举报