《剑指offer》中一个题目
1 简介:
优点:
用空间代替时间,极大的提升了实现排序所用的时间效率
缺点:
1.通过牺牲空间来提升时间,非常耗费内存资源
2.需要实现这个算法,必须知道传入的数组中的最大元素是多少,不然会引起索引越界等异常
2 代码实现
public static int[] zeroSort(int[] arr){
if (arr == null || arr.length == 0) {
return arr;
}
// 根据传入数组中的最大元素来申请新数组的最大长度
int count = 200;
int[] arr_sort = new int[count];
// 循环申请的新数组 将所有数据进行初始化操作
for (int i = 0; i < count; i++) {
// 初始化为0
arr_sort[i] = 0;
}
// 循环遍历传入的数组
for (int i = 0; i < arr.length; i++) {
// 以传入的数组中的数据作为申请数组中的索引
// 比如:当前 arr[0] 为 2,则将 2 分配为 新数组的索引 arr_sort[2]
// 至于为什么要使用 ++ ,也就是说 新数组存的是2在原数组里出现的个数
// 比如 arr_sort[2] = 4, 即2在原数组中出现了4次
++arr_sort[arr[i]];
}
// 定义索引为数组第一个元素的下标
int index = 0;
// 遍历申请的新数组的长度
for (int i = 0; i < count; i++) {
// 遍历申请的新数组中所有元素
for (int j = 0; j < arr_sort[i]; j++) {
// 将原数组的元素重新赋值
// 比如 arr_sort[i] = arr_sort[2] = 4 , i = 2
// 则此处需要循环遍历4次 arr[0] = 2,arr[1] = 2 ... arr[3]= 2
// 如果 arr_sort[i] = arr_sort[5] = 1 , i = 5
// 则此处需要循环遍历1次 arr[4] = 5
// 以此类推...
arr[index] = i;
index++;
}
}
return arr;
}
// 测试代码
public static void main(String[] args) {
int[] arr = {2,6,2,53,55,25,123,44,11,11,11,55,22,64,75,11,35,12,14,56,67};
int[] ints = zeroSort(arr);
System.out.println(Arrays.toString(ints));
}
{\__/} {\__/}
( ·-·) (·-· )
/ >------------------------------------------------< \
| ☆ |
| ☆ |
| ★ |
| ☆ |
| ☆ |
| |
-------------------------------------