zoukankan      html  css  js  c++  java
  • 桶排序

    任务描述

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

    相关知识——桶排序算法

    桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (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!
    ";
    
        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 **********/
    }
  • 相关阅读:
    Lucene.Net 2.3.1开发介绍 —— 二、分词(一)
    控制‘控制台应用程序’的关闭操作
    详解for循环(各种用法)
    敏捷软件开发
    Sql Server的一些知识点
    在SharePoint 2010 中配置Remote Blob Storage FILESTREAM Provider
    使用LotusScript操作Lotus Notes RTF域
    JOpt Simple 4.5 发布,命令行解析器
    John the Ripper 1.8.0 发布,密码破解工具
    PacketFence ZEN 4.0.1 发布,网络接入控制
  • 原文地址:https://www.cnblogs.com/xxxsans/p/14004720.html
Copyright © 2011-2022 走看看