计数排序题

一组随机排列的字母数组。请编写一个时间复杂度为O(n)的算法,使得这些字母按照字母从小到大顺序排好。

说明:字母区分大小写,相同的字母,排序后小写排在大写前。

例如:R,B,B,b,W,W,B,R,B,w
排序为:b,B,B,B,B,R,R,w,W,W
1)描述思路(2分)
2)请用你熟悉的编程语言编码实现(8分)

解答:
1)把字母转映射为数字,然后用计数排序算法排序,得到的排序后再映射回原来的字母。
2)


/***
 * 计数排序算法实现
 * @author haward
 * 时间复杂度:O(N)
 */
public class CountSort {

    public static void countSort(int[] arr)
    {
        if(arr==null||arr.length==0)
            return;

        int max=max(arr);

        int[] count=new int[max+1];
        Arrays.fill(count, 0);
        //计数
        for(int i=0;i<arr.length;i++)
        {
            count[arr[i]]++;
        }

        int k=0;
        for(int i=0;i<=max;i++)
        {
            for(int j=0;j<count[i];j++)
            {
                arr[k++]=i;
            }
        }

    }

    public static int max(int[] arr) {

        int max=Integer.MIN_VALUE;
        for(int ele:arr)
        {
            if(ele>max)
            {
                max=ele;
            }
        }
        return max;
    }

}

    @org.junit.Test
    public void testcountSort()
    {
        int[] arr={'R','B','B','b','W','W','B','R','B','w'};
        //将每个元素乘以2
        for(int i=0;i<arr.length;i++)
        {           
            arr[i]*=2;
        }
        //arr[i]-=65的目的是把小写字母插入到大写字母的排列中
        for(int i=0;i<arr.length;i++)
        {
            if(arr[i]>='a'*2&&arr[i]<='z'*2)
            {
                arr[i]-=65;//32.5*2
            }
        }
        //计数排序      
        CountSort.countSort(arr);
        //对排序后的元素还原
        for(int i=0;i<arr.length;i++)
        {
            if(arr[i]%2==0)
            {
                arr[i]/=2;
            }else{
                arr[i]=(arr[i]+65)/2;
            }
        }

        for(int i=0;i<arr.length;i++)
        {
            System.out.print((char)arr[i]);
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值