日月的弯刀  
Where Amazing Happens!

 


计数排序

 
 

第10节 计数排序练习题

 

对于一个int数组,请编写一个计数排序算法,对数组元素排序。

给定一个int数组A及数组的大小n,请返回排序后的数组。

测试样例:
[1,2,3,5,2,3],6
[1,2,2,3,3,5]
 
 
1
import java.util.*;
2

3
public class CountingSort {
4
    public int[] countingSort(int[] A, int n) {
5
        countingSort(A);
6
        return A;
7
    }
8

9
    public void countingSort(int[] arr) {
10
        int[] tempArr = new int[arr.length];// 临时数组
11
        int[] timesArr;// 统计每个元素出现的次数,放入到对应的桶中
12
        int range;// 统计这一组的范围,得出需要多少个桶
13
        int max = arr[0];
14
        int min = arr[0];
15
        for (int a : arr) {
16
            if (a > max)
17
                max = a;
18
            if (a < min)
19
                min = a;
20
        }
21
        range = max - min + 1;// 得出极值差,为了减小临时数组(统计各元素出现的次数)的长度
22
        timesArr = new int[range];
23

24
        for (int i = 0; i < arr.length; i++) {
25
            timesArr[arr[i] - min]++;
26
        }
27
        for (int i = 1; i < timesArr.length; i++) {// 得到所有元素的大小上的总体顺序
28
            timesArr[i] += timesArr[i - 1];
29
        }
30
        for (int i = 0; i < arr.length; i++) {// 将arr中元素的位置顺序对应到临时数组中
31
            int position = timesArr[arr[i] - min];// 得到arr[i]这个元素在整体上的位置
32
            tempArr[--position] = arr[i];// 根据上面的位置,将该元素放入到临时数组中
33
            timesArr[arr[i] - min]--;
34
        }
35
        for (int i = 0; i < arr.length; i++) {
36
            arr[i] = tempArr[i];
37
        }
38
    }
39
}
 
 
您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例
 
posted on 2017-03-08 20:49  日月的弯刀  阅读(480)  评论(0编辑  收藏  举报