桶排序

任务描述

本关任务:实现桶排序算法,并将乱序数列变成升序。

相关知识——桶排序算法

桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。

  • 算法步骤:

    1. 设置一个定量的数组当作空桶;

    2. 遍历输入数据,并且把数据一个一个放到对应的桶里去;

    3. 对每个不是空的桶进行排序;

    4. 从不是空的桶里把排好序的数据拼接起来。

编程要求

本关的编程任务是补全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!\n";

    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("\n");
    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 **********/
}

 

posted @ 2020-11-19 11:53  XXXSANS  阅读(246)  评论(0编辑  收藏  举报