计数排序&基数排序

 

计数排序

原理:    排队一样,个子一样高的在一队里,从小到大

需要一字队形的时候,依次从每个队里出列。

 


 

package Counting_Sort_Demo;



import edu.princeton.cs.algs4.In;



/**

* @Author:Allen

* @Date:5/19/2021 4:25 PM

*/

public class Counting_Sort_Demo3 {

public static void main(String[] args) {

int arr[]={1,3313,162,426,142,131,451,342,152,4131,41,143};

for (int i:

Counting_Sort(arr)) {

System.out.print(i+" ");

}

}

private static int[] Counting_Sort(int[] a){

int max = Integer.MIN_VALUE;

for (int i:

a) {

max = Math.max(i,max);  //挑选出最大的那个值

}

int [] count =new int[max+1]; //count数组的个数在最大值的个数上加1

for (int i:

a) {

count[i]++;    //计数组里的数字相同则加1

}

int[] result=new int[a.length];  // 开辟result数组空间,长度为原数组的长度

int index = 0;                   // 下标为0 

for (int i = 0; i < count.length;i++ ){  

while (count[i]>0){              // 计数数组里的数组元素大于0,那么就将i复制给result数组

result[index++] = i;

count[i]--;                     //原数组长度减1

}

}

return result;                  //返回result数组

}

}

 

坑路分享:

 

 

总结:计数排序的时间复杂程度为O(n+k),k为输入的数字范围,所以建议是输入0-100内的数字。

 

 

基数排序

原理:想象军训的时候把,每排一起训练好之后,前后排训练,再到一个方队,之后是院级展示,校级展示。(四年大学生活转瞬即逝,哈哈~,黑照仿佛还在眼前,和兄弟们一起珍惜时间了)。我们把末尾的个位收拾好了,再去按照十位来排,依次类推。

 

我们为什么要按照从个位的数值从小到大开始排起呢?

 

后面的对于整体的数值影响小,相反前面的位数影响大。

 

 

 


 

package Radix_Sort_Demo;



import java.util.Random;



/** 为什么学习编程,将自动化的东西给电脑来完成

* @Author:Allen

* @Date:5/21/2021 4:33 PM

*/

public class Radix_Sort_Demo3 {

private static void Radix_Sort(int [] a,int x ) {

int n = 1;

int k = 0;           //定义部分,n是个十百千位;k是数组下标

int length = a.length; 

int[][] buckets = new int[10][length];//buckets是二维数组桶,一维是多少个桶,二维是桶容量 

int[] count = new int[length]; // count数组是计数组

while (n < x) {       //n代表当前位数仍在x原数组的射程范围内

for (int i :

a) {

int digit = (i / n) % 10; //digit 某一位上的具体值是多少,比如39的个位上数值为9

buckets[digit][count[digit]] = i; // 为buckets桶赋值原数组的值,比如29,39,49首次在一个桶中

count[digit]++; // count数组作为计数组将29,39,49分隔开

}

for (int i = 0; i < length; i++) { 

if (count[i] != 0) {//count数组不为0,代表一个桶里面还有数

for (int j = 0; j < count[i]; j++) {

a[k] = buckets[i][j];//准备将buckets数组重新赋值给原数组

k++;

}

}

count[i] = 0;//for循环结束赋值后,将计数组重新赋值为0,方便下次的输出

}

n = 10*n ;//接下来到十位

k = 0 ;//下标为0

}

}

public static void main(String[] args) {

int [] a =new int[10];    // 自动更新十个数字,并且赋值

for (int i = 0; i <10 ;i++){

a[i] = new Random().nextInt(100)+1;

}

Radix_Sort(a,100);

for (int i:

a) {

System.out.print(i+" ");

}

}

}

坑路分享:

 

 

总结:桶排序,计数排序,基数排序都用到了桶的概念

三类排序总结

关于桶的不同使用

桶排序

每个桶装有一个范围的数字

计数排序

每个桶有特定键值

基数排序

根据数上不同位置的键值分配桶

 

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值