模拟:桶排序

以前认为负数不可做

只需要多开点儿空间维护一下负数就好了

 1 #include<iostream>
 2 using namespace std;
 3 int main() {
 4     int book[100] = {0};//标志位,标记桶内数据量
 5     int bookN[100] = { 0 };//标志负位
 6     int input[11];
 7     int heap[100] = {0};//初始化堆,排序0到100之间的数,heap[排序范围最大值]
 8     int i,j;
 9     int result;
10     for (size_t i = 1; i <=10 ; i++)
11     {
12         cin >> input[i];        
13         
14         if (input[i]>=0)//排序的数为正数
15         {
16             heap[input[i]] = 1;
17             book[input[i]] += 1;
18         }
19         else//排序的数为负数
20         {
21             input[i] = abs(input[i]);
22             heap[input[i]] = 1;
23             bookN[input[i]] += 1;
24             
25             
26         }
27     }
28     for (int i = 99; i>=0; i--)//输出负数的排序结果,因为负数,所以桶从序号大的到序号小的遍历
29     {
30         if (heap[i] == 1) {
31             for (j = 1; j <= bookN[i]; j++)
32             {
33                 result = 0 - i;
34                 cout << result << " ";//输出排序结果
35             }
36  
37         }
38     }
39     for (int i = 0; i <100 ; i++)//输出正数的排序结果
40     {
41         if (heap[i]==1) {
42             for ( j = 1;j<=book[i]; j++)
43             {
44                 cout << i << " ";//输出排序结果
45             }
46             
47         }
48     }
49     cout << endl;
50     getchar();
51  
52     return 0;
53 }

桶排序的时候你必须保证数据是离散的,离散程度是均一的

而且数据范围不能让空间无法承受

posted @ 2018-09-11 20:11  静听风吟。  阅读(214)  评论(0编辑  收藏  举报