在我们生活中排序是经常出现的,比如我们网上买东西的时候需要按照价格排序,创建的数据需要按照创建的时间排序等等,可以说排序是无处不在的。
举一个简单的栗子:比如一个分数数组为[5,3,5,2,8],满分是10分,接下来我们按照从大到小排序,排序后的结果是[8,5,5,3,2].
提示:首先我们借助一个一维数组就可以搞定。
思路:首先我们申请一个大小为11的数组int[]arr = new int[11],好了,现在我们已经有11个变量,编号一次是arr[0]-arr[10];你可以初始化为这十个变量值为0,在这里我们用的是java,java初始化的时候默认是0.初始化为0的含义是表示这些分数还没有人得过。比如arr[0]=0表示没有人得过0分;arr[1]=0表示没有人得过1分;arr[10]=0表示没有得过10分。
下面开始处理每一个人的分数,第一个是5分,我们就将对应的arr[5]的值在原来的基础上增加1.即arr[5]=1。表示5分数出现过一次。同理所有的数据一次这样处理。
java代码实现如下:
public class BubleSort {
public static void main(String[] args) {
int [] arr = {5,3,5,2,8};
int max = 10;
sortASC(arr,max);
sortDESC(arr,max);
}
//从小到大排序
private static void sortASC(int[] arr,int max) {
int [] help = new int[max+1];
for (int i=0;i<arr.length;i++) {
int num = arr[i];
help[num]+=1;
}
//循环遍历help
for (int i=0;i<help.length;i++) {
int num = help[i];
for (int t=1;t<=num;t++) {
if (num !=0) {
System.out.print(i+" ");
}
}
}
System.out.println();
}
//从小到大排序
private static void sortDESC(int[] arr,int max) {
int [] help = new int[max+1];
for (int i=0;i<arr.length;i++) {
int num = arr[i];
help[num]+=1;
}
//循环遍历help
for (int i = help.length-1;i>=0;i--) {
int num = help[i];
for (int t=1;t<=num;t++) {
if (num !=0) {
System.out.print(i+" ");
}
}
}
System.out.println();
}
}
这种排序的方法我们暂且叫做桶排序,其实真正的桶排序比这个要复杂,这个只是一个简单栗子而已,使用的范围也不大,因为这个排序太浪费空间了,如果我的max很大是不是要申请的内存空间很大。简单的桶排序时间复杂度O(m+n)