算法导论第八章__实现计数排序

来源:互联网 发布:免费网络短信平台 编辑:程序博客网 时间:2024/06/08 11:59

计数排序:不需要比较就能得出排序的顺序__例如,本章的计数排序、基数排序、桶排序

比较排序:需要进行比较才能得出排序的顺序__例如,本章的堆排序、快速排序(本质是插入排序)、插入排序


代码清单:计数排序__完美演绎下标的作用

public class Count_Sort {//接收需要排序的数组private int[] A;//排序后的数组private int[] B;//用于计数的数组private int[] C;// 初始化public Count_Sort(int[] A) {this.A = A;B = new int[A.length];C = new int[innitTemp()];}// 初始化临时数组的大小public int innitTemp() {int bigest = A[0];for (int i = 1; i < A.length; i++) {if (A[i] > bigest) {bigest = A[i];}}return bigest+1;}// 计数排序public void sort() {// 把i中对应的元素映射到C中for (int i = 0; i < A.length; i++) {int value = A[i];C[value] = C[value] + 1;// 用C统计value有多少个}show(C);// 对C的值含义进行更换,换为有多少个小于当前下标的个数for (int i = 1; i < C.length; i++) {C[i] += C[i - 1];}show(C);// 最后得出来A[i]元素正确的插入位置for (int i = A.length - 1; i >= 0; i--) {int value = A[i];// 为什么要-1呢?想想,如果比5小的数是2个,那5就应该查到数组的2个位置,那么第2个位置,对应就是A[C[value]-1]B[C[value] - 1] = value;// 这个很重要!例如,A[5]==A[2]这种情况,A[5]插入了正确的位置,那么A[2]插入的顺序怎么算呢?就让它紧跟在A[5]后面!C[value] -= 1;}show(B);}public void show(int[] X) {for (int i = 0; i < X.length; i++) {int j = X[i];System.out.print(j + "  ");}System.out.println();System.out.println("--------------------------------------------------------------");}public static void main(String[] args) {int []A={1,2,3,3,2,1,1,5,1,3,4,5};Count_Sort sort=new Count_Sort(A);sort.sort();}}

输出的结果:

0  4  2  3  1  2  
--------------------------------------------------------------
0  4  6  9  10  12  
--------------------------------------------------------------
1  1  1  1  2  2  3  3  3  4  5  5  
--------------------------------------------------------------

0 0
原创粉丝点击