zoukankan      html  css  js  c++  java
  • 算法

    要点:利用空间换时间,按照数组下标,对应元素。试用于都是整数,且最大最小值相差不大的情况。

     1 public class CountSort {
     2 
     3     public void sort(int[] arr) {
     4         printArr(arr, " => 原数组");
     5         // 确认最大最小值
     6         int max = arr[0];
     7         int min = arr[0];
     8         for (int i = 1; i < arr.length; i++) {
     9             if (arr[i] > max) {
    10                 max = arr[i];
    11             }
    12             if (arr[i] < min) {
    13                 min = arr[i];
    14             }
    15         }
    16         // 根据最大最小值创建数组
    17         int length = max - min + 2;
    18         int[] countArr = new int[length];
    19         printArr(countArr, " => 计数数组");
    20         // 处理有负数的情况
    21         int zeroIndex = 0;
    22         if (min < 0) {
    23             zeroIndex = min * -1;
    24         }
    25         // 计数
    26         for (int i = 0; i < arr.length; i++) {
    27             if (zeroIndex > 0) {
    28                 countArr[arr[i] + zeroIndex]++;
    29             } else {
    30                 countArr[arr[i]]++;
    31             }
    32         }
    33         printArr(countArr, " => 完成计数");
    34         // 给原数组赋值
    35         int index = 0;
    36         for (int i = 0; i < countArr.length; i++) {
    37             while (countArr[i]-- > 0) {
    38                 if (zeroIndex > 0) {
    39                     arr[index++] = i - zeroIndex;
    40                     continue;
    41                 }
    42                 arr[index++] = i;
    43             }
    44         }
    45         printArr(arr, " => 完成赋值");
    46     }
    47 
    48     private void printArr(int[] arr, String message) {
    49         for (int i : arr) {
    50             System.out.print(i + ",");
    51         }
    52         System.out.println(message);
    53     }
    54 
    55     public static void main(String[] args) {
    56         CountSort cs = new CountSort();
    57         int[] arr = new int[]{-1, 3, -5, 7, 8, 0, 5, 7, 11};
    58         cs.sort(arr);
    59     }
    60 
    61     /**
    62      * -1,3,-5,7,8,0,5,7,11 => 原数组
    63      * 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 => 计数数组
    64      * 1,0,0,0,1,1,0,0,1,0,1,0,2,1,0,0,1,0 => 完成计数
    65      * -5,-1,0,3,5,7,7,8,11 => 完成赋值
    66      *
    67      * 利用空间换时间的想法
    68      * => 遍历次数为m+m+k,m为原数组,k为计数数组
    69      * => 时间复杂度:O(n)
    70      * => 稳定性:稳定 => 都是整数
    71      */
    72 
    73 }
  • 相关阅读:
    Ext.create() 时的自适应高度和宽度
    C++ builder快捷键大全
    删除右键菜单中的选项
    函数中指针和引用的形参和实参
    一道关于继承和多态的题目
    关于静态对象构造
    关于多态代码和运行结果
    如何使用C++ Builder 6.0连接Access数据库
    BCB中的RTTI机制
    scanf()返回值(转)
  • 原文地址:https://www.cnblogs.com/SamNicole1809/p/12807604.html
Copyright © 2011-2022 走看看