貌似基数排序

如给定数组{1,3,51,5,512,671,9,67},设计程序,输出{9,671,67,512,51,5,3,1}

基本思想是给每一位数字定权重,然后使用如W[671] = 6 * w1 + 7 * w2 + 1 * w3;W的个数由数组中位数最长的数字决定。由数组中数字对应的权值来排序即可

程序如下:

 1 import java.util.*;
 2 import java.math.*;
 3 public class Hello {
 4    public static List<Integer> sort(int[] arr)
 5    {
 6        String[] strs = new String[arr.length];
 7        int curLen = 0, maxLen = 0;
 8        for(int i = 0; i < strs.length; i++)
 9        {
10            strs[i] = String.valueOf(arr[i]);
11            curLen = strs[i].length();
12            if(curLen > maxLen)
13                maxLen = curLen;
14        }
15        HashMap<String,Integer> hm = new HashMap<String,Integer>();
16        for(int i = 0; i < strs.length; i++)
17        {
18            hm.put(strs[i],0);
19            for(int j = 0; j < strs[i].length(); j++)
20            {
21                hm.put(strs[i],hm.get(strs[i]) + (strs[i].charAt(j) - ‘0‘)*(int)Math.pow(10,maxLen - j));
22            }
23        }
24        List<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>();
25        list.addAll(hm.entrySet());
26        ValueComparator vc = new ValueComparator();
27        Collections.sort(list,vc);
28        List<Integer> intList = new ArrayList<Integer>();
29        for(Iterator<Map.Entry<String,Integer>> it = list.iterator();it.hasNext();)
30        {
31             intList.add(Integer.valueOf(it.next().getKey()));
32        }
33
34        return intList;
35    }
36
37    public static void main(String[] args) {
38        int[] arr = {11,1,12,23,24,22,456,467,567};
39        List<Integer> a =sort(arr);
40        System.out.println(a);
41    }
42 }
43
44 class ValueComparator implements Comparator<Map.Entry<String,Integer>>
45 {
46     public int compare(Map.Entry<String,Integer> mp1,Map.Entry<String,Integer> mp2)
47     {
48         return mp2.getValue() - mp1.getValue();
49     }
50 }
时间: 2024-10-21 07:59:17

貌似基数排序的相关文章

[算法]基数排序简述

在学习了计数排序后,可以发现一个很严重的问题,如果数据很大呢,不如说每个元素小于2^64 - 1,超时可能不怎么会,数据不好的 情况下会超内存 (虽然可以直接用快排,但是为了讲解基数排序还是讲一下基数排序) 基数排序可以说成是改良版的桶排,还是将一些数放入指定的桶中 比如一串数 12 33 43 54 65 39 45 72 89 首先按照个位分配到 0 - 10 这11个“桶”中 0 1 2 12 72 3 33 43 4 54 5 65 45 6 7 8 9 39 89 接着再串起来,得到了

计数排序+基数排序

这几天一直在写排序算法,从插入,冒泡,选择到归并和快速再到计数和基数排序.今天来写下计数排序和基数排序吧. 计数排序:对于一组小于k的数组,进行排序.这里要保证输入的关键值在[0..k]之间.貌似很简单,我们先不管什么是计数排序CountSort(A,1,n),先来看一下一段代码. CountPrint(int *A,int n,int k)代码: void CountPrint(int *A,int n,int k){//输入数组A,每个元素都小于k //C[i]用来计算i出现的次数,起初C[

基数排序及C语言实现

基数排序的基本思想是对数字的每一位进行排序,先对个位排序,然后十位,百位--,对每一位进行排序时,要求采用稳定排序算法,比如前面讨论过的计数排序.以一个三位整数为例,过程是这样的: 该算法同样能达到线性复杂度.下面是代码.(好吧,我知道写的很菜--) #include <stdio.h> #define NUM 10 //数组元素个数 void counting_sort(int a[],int b[],int c[],int atemp[]); int main() { int i; int

数据结构-基数排序

#include <iostream> using namespace std; void CountSort(int* a,int k,int n){ int s = 1; for(int i=0;i<k;i++){ s *= 10; } int* b = new int[n]; int* c = new int[n]; for(int i=0;i<n;i++){ b[i] = 0; c[i] = 0; } int tmp1 = 0; for(int i=0;i<n;i++

基本排序算法(冒泡排序 选择排序 插入排序 快速排序 归并排序 基数排序 希尔排序)

冒泡排序 public static void bubbleSort(int[] arr){ int lgn = arr.length; for (int i = 0; i < lgn - 1; i++) { for (int j = 0; j < lgn - 1 - i; j++) { if(arr[j] > arr[j + 1]){ int temp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = temp; } } } } 选择排序 publ

基数排序与桶排序,计数排序【详解】

桶排序简单入门篇^-^ 在我们生活的这个世界中到处都是被排序过的东东.站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……总之很多东东都需要排序,可以说排序是无处不在.现在我们举个具体的例子来介绍一下排序算法. 首先出场的是我们的主人公小哼,上面这个可爱的娃就是啦.期末考试完了老师要将同学们的分数按照从高到低排序.小哼的班上只有5个同学,这5个同学分别考了5分.3分.5分.2分和8分,哎,考得真是惨不忍睹(满分是10分).接下来将分

基数排序(桶排序) 不同方法

详细解释:算法导论/数据结构书 1.链式基数排序 //n个数,每个数有g个关键字//排序:从最后的关键字开始到最前的关键字//分配+收集//每个关键字分配+收集需要n+n时间,而共有g个关键字,时间复杂度为O(2ng),效率很高.//如果用数组,数据集中在一个区间,则区间的长度很长,另外的区间的内存浪费了.//用链表可以解决这个问题,且数据不需要先后顺序,所以无必要非要用数组 1 #include <stdio.h> 2 #include <stdlib.h> 3 //个数 4 #

基数排序

基本解法 第一步 以LSD为例,假设原来有一串数值如下所示: 73, 22, 93, 43, 55, 14, 28, 65, 39, 81 首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中: 0 1 81 2 22 3 73 93 43 4 14 5 55 65 6 7 8 28 9 39 第二步 接下来将这些桶子中的数值重新串接起来,成为以下的数列: 81, 22, 73, 93, 43, 14, 55, 65, 28, 39 接着再进行一次分配,这次是根据十位数来分配: 0

重复造轮子系列--计数,基数排序

计数,基数的中文读音都一样,这翻译的人还嫌我们计算机不够乱,真的想吐槽. 不管了,毕竟代码还是不一样的. 1.计数排序(counter sort): 通过一个上限来统计集合里的数值(或者其他非数值类型映射的数值),并累计比小于自己(包括)的数值的统计的个数,从而形成排序的索引(也就是前面有多少个小于我的,我的位置就确定了). 普通计数排序代码:(仍需优化,valuetype默认是整数类型) 1 template<typename _InIt> 2 void counter_sort(_InIt