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 **********/
    }
  • 相关阅读:
    typecho开启pjax,ajax,无刷新
    typecho 调用评论最多热门文章
    typecho 文章归档调用
    剑指offer解题报告(Java版)——翻转单词顺序 左旋字符串 42
    剑指offer解题报告(Java版)——和为s的两个数,一串连续数 41
    剑指offer解题报告(Java版)——数组中只出现一次的数字 40
    J2EE——J2EE的十三种技术
    剑指offer解题报告(Java版)——二叉树的深度 判断二叉树是否平衡 38
    剑指offer解题报告(Java版)——找到两个链表的第一个公共节点 37
    剑指offer解题报告(Java版)——求逆序对 36
  • 原文地址:https://www.cnblogs.com/xxxsans/p/14004720.html
Copyright © 2011-2022 走看看