首页 > 试题广场 >

排序(基数排序)

[编程题]排序(基数排序)
  • 热度指数:1506 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给你一个n代表有n个数字,然后你需要使用基数排序将这些数字从小到大排好。

输入描述:
第一行输入一个n,代表有n个数字
第二行输入n个数


输出描述:
输出排序好后的n个数
示例1

输入

4
4 3 2 1

输出

1 2 3 4
package BasicSort;  import java.util.Arrays; import java.util.Scanner;  public class BasicSort { public static void main(String args[]){
        Scanner scanner = new Scanner(System.in);  int n = scanner.nextInt();  int[] arr = new int[n];  for(int i = 0 ; i < n ; i++){
            arr[i] = scanner.nextInt();  } basicSort(arr);  System.out.println(Arrays.toString(arr));  } public static void basicSort(int[] arr){ //1.得到数组中最大的位数  int max = 0;  for(int i = 0 ; i < arr.length ; i++){ if(arr[i] > max){
                max = arr[i];  }
        } //得到最大数是几位  int length = (max+"").length();  /*  * 定义一个二维数组,表示十个桶  * 说明:  * 1.二维数组包含十个一维数组  * 2.为了防止在放入数的时候,数据溢出,则每一个一维数组,大小定义为 arr.length()  * 3.基数排序是空间换时间的经典算法  * */  int[][] bucket = new int[10][arr.length];  //为了记录每个桶中存放了多少个数据。我们定义一个一维数组来记录各个桶中每次放入数据的个数  //比如 bucketElementCount[1] 就表示bucket[1]桶中的数据个数  int[] bucketElementCount = new int[10];  //这里我们使用循环将代码进行处理  for(int i = 0 ,n = 1; i < length ; i++ , n *= 10){ //针对每个元素的对应位进行排序处理,第一次是个位,第二次是十位,第三次是百位。。。。  for(int j = 0 ; j < arr.length ; j++){ //取出每个元素对应位的值  int digitOfElement = arr[j] / n % 10;  //放入到对应的桶中  bucket[digitOfElement][bucketElementCount[digitOfElement]] = arr[j];  bucketElementCount[digitOfElement]++;  } //按照这个桶的顺序,(一维数组的下标,依此取出数据放到原数组)  int index = 0;  //遍历每一桶,并将每一桶的数据,放入到原数组  for(int k = 0 ; k < bucketElementCount.length ; k++){ //如果桶中有数据,我们取出,然后放回原数组  if(bucketElementCount[k] != 0){ for(int l = 0 ; l < bucketElementCount[k] ; l++){
                        arr[index++] = bucket[k][l];  }
                } //当把每个桶中数据取出后,需要将每个 bucketElementCounts[k] = 0 !!!!  bucketElementCount[k] = 0;  }
        }
    }
}
发表于 2023-07-11 10:08:33 回复(0)

#include<iostream>
#include<vector>
using namespace std;

int main()
{
    int n;
    cin >> n;
    vector<int>nums(n);
    vector<int>temp(n);
    vector<int>bar(10);
    vector<int>count(10);
    int maxDigit = 1;
    int pos = 10;
    for (int i = 0; i < n; ++i)
    {
        cin >> nums[i];
        while (nums[i] >= pos)
        {
            maxDigit++;
            pos *= 10;
        }
    }
    pos = 10;
    for (int i = 0; i < maxDigit; ++i)
    {
        //全部元素装入桶里
        for (int j = 0; j < n; ++j)
        {

            bar[(nums[j]/(pos/10)) % 10]++;
        }
        //计算count数组
        count[0] = bar[0];
        for (int j = 1; j < 10; ++j)
        {
            count[j] = bar[j] + count[j - 1];

        }
        //将按位排好的元素装入到一个临时容器中
        for (int j = n - 1; j >= 0; --j)
        {
            temp[count[(nums[j] / (pos / 10)) % 10]-1] = nums[j];
            count[(nums[j] / (pos / 10)) % 10]--;
        }

        nums.assign(temp.begin(),temp.end());
        bar.assign(10, 0);
        pos *= 10;
    }
    for (int i = 0; i < n; ++i)
    {
        cout << nums[i] << " ";
    }
    return 0;

}

编辑于 2022-08-20 12:16:14 回复(0)

问题信息

上传者:小小
难度:
2条回答 1157浏览

热门推荐

通过挑战的用户

排序(基数排序)