任务描述
本关任务:实现桶排序算法,并将乱序数列变成升序。
相关知识——桶排序算法
桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。
-
算法步骤:
-
设置一个定量的数组当作空桶;
-
遍历输入数据,并且把数据一个一个放到对应的桶里去;
-
对每个不是空的桶进行排序;
-
从不是空的桶里把排好序的数据拼接起来。
-
编程要求
本关的编程任务是补全sort.h文件中的bucketSort
函数,实现把输入的待排序序列,根据待排序序列中的最小值min和最大值max的差值,分为区间长度均为(浮点型)interval=(max-min)/10的10个桶,区间分别是[min,min+interval)、 [min+interval,min+2*interval)、[min+2*interval,min+3*interval) .....[min+9*interval,min+10*interval]
,然后对待排序元素进行入桶、桶内排序、输出桶元素统计、桶元素回收,并输出排序后元素的升序排列序列。 void bucketSort(int arr[], int n);
评测说明
本关中包含三个文件分别是: step5/sort.h :此文件为学员文件,其中bucketSort函数待补充完整 step5/main.cpp:此文件为评测文件(含main函数),引用“sort.h”。 (上述三个文件可通过点击在代码取的右上角文件夹中的step5文件夹中查看)
输入输出说明
输入n(1<=n<=100),输入n个整数,求n个数的最大值max和最小值min,以(max-min)/10作为桶区间长度interval,输出各个桶内的元素统计数,(占一行,元素用一个空格隔开);输出排序后的升序序列(占一行,元素用一个空格隔开)。
以下是平台的测试样例: 测试输入: 5
1 2 3 4 100
预期输出: 4 0 0 0 0 0 0 0 0 1 1 2 3 4 100
(说明,输入5个数,最小值min=1,最大值max=100,interval=(100-1)/10=9.9,10桶的区间范围分别为:[1,10.9) [10.9,20.8).....[90.1,100]
) 注意: 桶号的计算如下: 桶号= (待排序元素的值 -最小值)/ 区间值; if(桶号>=桶数) 桶号=桶数-1;//桶号的范围要控制在0~桶数-1
测试输入: 10
7 1 4 6 8 9 5 2 3 10
预期输出: 1 1 1 1 1 1 1 1 1 1 1 2 3 4 5 6 7 8 9 10
测试输入: 30 12 48 46 13 12 14 0 25 20 4 30 17 41 12 13 28 16 18 48 3 23 5 37 15 3 29 16 34 41 28
预期输出: 4 1 6 5 2 4 2 1 2 3 0 3 3 4 5 12 12 12 13 13 14 15 16 16 17 18 20 23 25 28 28 29 30 34 37 41 41 46 48 48
main.cpp
#include <iostream> #include "sort_.h" int main(int argc, const char * argv[]) { // insert code here... // std::cout << "Hello, World! "; int n; scanf("%d", &n); int *arr; arr = (int*)malloc(sizeof(int)*n); for (int i=0; i<n; i++) { scanf("%d", &arr[i]); } sort_array(arr, n); return 0; }
sort.h
// // sort_.h // Sort // // Created by ljpc on 2018/4/20. // Copyright © 2018年 ljpc. All rights reserved. // #ifndef sort__h #define sort__h #include <cstdio> #include <algorithm> using namespace std; void print_array(int *arr, int n); // 打印数组 void sort_array(int *arr, int n); // 数组排序 #endif /* sort__h */
sort.cpp
#include <iostream> #include <algorithm> #include <vector> using namespace std; // 打印arr数组的arr[0~n-1]元素,元素之间使用一个空格相隔 void print_array(int arr[], int n); // 编程实现桶排序:根据待排序序列的最小值min和最大值max的差值,分为区间长度均为(浮点型)interval=(max-min)/10的10个桶 // 分别存放[min,min+interval)、 [min+interval,min+2*interval4)、 [min+2*interval,min+3*interval) .....[min+9*interval,min+10*interval] // 函数参数:数组arr ,数组长度n void bucketSort(int arr[], int n); void print_array(int arr[], int n) { for (int i = 0; i < n; i++) { cout << arr[i]<< " "; } cout << endl; } void bucketSort(int* arr, int n) { // 请在这里补充代码,完成本关任务 /********** Begin **********/ int max = arr[0]; int min = arr[0]; for (int i = 1; i < n; i++) { max = max > arr[i] ? max : arr[i]; min = min < arr[i] ? min : arr[i]; } float interval = ((float)max - (float)min) / 10.0; //int in = (int)interval; int a1[100], a2[100], a3[100], a4[100], a5[100]; int a6[100], a7[100], a8[100], a9[100], a10[100]; int i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0; int i7 = 0, i8 = 0, i9 = 0, i10 = 0; for (int i = 0; i < n; i++) { if (arr[i] >= min + 9 * interval) { a10[i10] = arr[i]; i10++; } else if (arr[i] >= min + 8 * interval) { a9[i9] = arr[i]; i9++; } else if (arr[i] >= min + 7 * interval) { a8[i8] = arr[i]; i8++; } else if (arr[i] >= min + 6 * interval) { a7[i7] = arr[i]; i7++; } else if (arr[i] >= min + 5 * interval) { a6[i6] = arr[i]; i6++; } else if (arr[i] >= min + 4 * interval) { a5[i5] = arr[i]; i5++; } else if (arr[i] >= min + 3 * interval) { a4[i4] = arr[i]; i4++; } else if (arr[i] >= min + 2 * interval) { a3[i3] = arr[i]; i3++; } else if (arr[i] >= min + interval) { a2[i2] = arr[i]; i2++; } else if (arr[i] >= min) { a1[i1] = arr[i]; i1++; } } printf("%d %d %d %d %d %d %d %d %d %d ", i1, i2, i3, i4, i5, i6, i7, i8, i9, i10); printf(" "); if(i1 != 0) sort(a1, a1 + i1); if(i2 != 0) sort(a2, a2 + i2); if(i3 != 0) sort(a3, a3 + i3); if(i4 != 0) sort(a4, a4 + i4); if(i5 != 0) sort(a5, a5 + i5); if(i6 != 0) sort(a6, a6 + i6); if(i7 != 0) sort(a7, a7 + i7); if(i8 != 0) sort(a8, a8 + i8); if(i9 != 0) sort(a9, a9 + i9); if(i10 != 0) sort(a10, a10 + i10); int i = 0; for (int j = 0; j < i1; j++) { arr[i] = a1[j]; i++; } for (int j = 0; j < i2; j++) { arr[i] = a2[j]; i++; } for (int j = 0; j < i3; j++) { arr[i] = a3[j]; i++; } for (int j = 0; j < i4; j++) { arr[i] = a4[j]; i++; } for (int j = 0; j < i5; j++) { arr[i] = a5[j]; i++; } for (int j = 0; j < i6; j++) { arr[i] = a6[j]; i++; } for (int j = 0; j < i7; j++) { arr[i] = a7[j]; i++; } for (int j = 0; j < i8; j++) { arr[i] = a8[j]; i++; } for (int j = 0; j < i9; j++) { arr[i] = a9[j]; i++; } for (int j = 0; j < i10; j++) { arr[i] = a10[j]; i++; } /********** End **********/ }