计数排序
原理: 排队一样,个子一样高的在一队里,从小到大
需要一字队形的时候,依次从每个队里出列。
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+" ");
}
}
}
坑路分享:
总结:桶排序,计数排序,基数排序都用到了桶的概念
三类排序总结 | 关于桶的不同使用 |
桶排序 | 每个桶装有一个范围的数字 |
计数排序 | 每个桶有特定键值 |
基数排序 | 根据数上不同位置的键值分配桶 |