DS_【非比较排序】

Java_【非比较排序】
(1)计数排序
计数排序的思想体现在分配和收集 与比较排序不同非比较排序不用去比较各个数字之间的大小直接利用数组的特性去存储,数组本就可以存放数据取数组的下标从小到大依然有序。所以我们直接利用数组的特性
整个分配过程相当于 我们在手里拿到一堆无序的扑克牌然后我们按照地上所标记的数字依次将拿到的牌放置其中最后在从地上依次拿起那么这组牌就会有序
排序过程描述
在这里插入图片描述
1.准备一个与原来数组A最大值与最小值差值的数组 tem
2.然后依次从待排序数组中拿取数字
3.将拿到的数字按照A数组下标进行存放用来计数
在这里插入图片描述
4.然后将tem中的数字进行转化 将tem[i] 转化为小于等于i元素的个数
在这里插入图片描述
为什么要去这样做 因为这里刚好有一个逆思维我们实际上存放数字顺序的是数组tem的下标而数组tem[i]存放的值表示当前等于下标值得个数然而 只要求出 之前的小于等于i的值就能拿到下标在有序数组中的位置
5.对比原来无序数组 从后向前拿到的数字就是tem的存放的数值所对应的的下标就是数组A[i]在有序数组中该有的位置
在这里插入图片描述
注意:在这里存放数据时tem[arr[i]-m] 用来表示在tem中存放的位置 -m保证在tem中存储从0开始 不浪费存储空间
排序算法描述
1.准备一个过度数组tem 大小为数组A最大值与最小值的差+1
2.第一次遍历找到A中元素并且将个数累计存放在tem中
3.第二次遍历 先将 tem[i]的值存入item 表示个数循环item-- 将tem的下标按照item存入arr中 最后 arr就是排好的数组
代码实现

public static void main(String[] args) {
    int[] A = {8,4,5,7,1,3,6,2};
    countSort(A,1,8);
    System.out.println(Arrays.toString(A));
}
public static void countSort(int[] arr,int m,int n){
    int len = arr.length;
    int[] tem = new int[n-m+1];
    for(int i=0;i<len;i++){
        tem[arr[i]-m]++;
    }
    for(int i=0,index=0;i<tem.length;i++){
        int item = tem[i];
        while(item--!=0){
            arr[index++]=i+m;
        }
    }
}

(2)基数排序
基数排序的实质时 在排序的过程中 从个位开始依次排序 然后十位依次排序 然后百位依次排序
算法过程
1.构造二维数组用来作为存放排序过程的容器
2.循环操作 从个位开始进行一次比较 将各个数字按照个位大小存入然后按照各个位置的元素依次从小取出,每一个位置上遵循先进先出
代码实现

public void sort(int[] array) {
        //首先确定排序的趟数;     
        int max = array[0];
        for (int i = 1; i < array.length; i++) {
            if (array[i] > max) {
                max = array[i];
            }
        }
        int time = 0;
        //判断位数;     
        while (max > 0) {
            max /= 10;
            time++;
        }
        //建立10个队列;     
        List<ArrayList> queue = new ArrayList<ArrayList>();
        for (int i = 0; i < 10; i++) {
            ArrayList<Integer> queue1 = new ArrayList<Integer>();
            queue.add(queue1);
        }
        //进行time次分配和收集;     
        for (int i = 0; i < time; i++) {
            //分配数组元素;     
            for (int j = 0; j < array.length; j++) {
                //得到数字的第time+1位数;   
                int x = array[j] % (int) Math.pow(10, i + 1) / (int) Math.pow(10, i);
                ArrayList<Integer> queue2 = queue.get(x);
                queue2.add(array[j]);
                queue.set(x, queue2);
            }
            int count = 0;//元素计数器;     
            //收集队列元素;     
            for (int k = 0; k < 10; k++) {
                while (queue.get(k).size() > 0) {
                    ArrayList<Integer> queue3 = queue.get(k);
                    array[count] = queue3.get(0);
                    queue3.remove(0);
                    count++;
                }
            }
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值