zoukankan      html  css  js  c++  java
  • 一种时间复杂度为O(n)的排序方法(转载)

    原文地址:http://my.oschina.net/u/158457/blog/28536

    排序的方法很特别,有点类似插入排序的味道

    先看下代码

     1 public class Sort {
     2     private static boolean[] temp = new boolean[10000];
     3 
     4     /**
     5      * @notice 注意参数中的array数组中的每个元素大小不能超过9999,而且不能有重复元素。
     6      *         同时也就意味着array数组大小不能超过10000,其中元素大小在0-9999的这样一个范围。
     7      */
     8     public void sort(int[] array) {
     9         init();
    10         for (int i = 0; i < array.length; i++) {
    11             temp[array[i]] = true;//这个是核心 保证了temp数组中子元素为true的对象是按array[i]中元素的正序进行排序的 
    12         }
    13 
    14         int loc = 0;
    15         for (int j = 0; j < temp.length; j++) {
    16             if (temp[j])
    17                 array[loc++] = j;
    18         }
    19     }
    20 
    21     private void init()// 其实在此方法中通过传一个整数可以剪枝,而整数为array数组中元素的最大值
    22     {
    23         for (int i = 0; i < temp.length; i++)
    24             temp[i] = false;
    25     }
    26 
    27     public void print(int[] array) {
    28         for (int i = 0; i < array.length; i++)
    29             System.out.print(array[i] + "  ");
    30         System.out.println();
    31     }
    32 
    33     public static void main(String[] args) {
    34         Sort sort = new Sort();
    35         int array[] = new int[] { 3, 5, 1, 2, 10, 88, 25, 66 };
    36         sort.print(array);
    37         sort.sort(array);
    38         sort.print(array);
    39     }
    40 }

    核心代码

     temp[array[i]] = true;

    原作者提到了此方法存在的缺陷:1.数组不能重复 2.array数组中的每个元素大小不能超过9999
     
  • 相关阅读:
    java 单向链表实现
    super、this
    Java程序员们最常犯的10个错误
    Codeforces-1323D Present
    Codeforces-1323E Instant Noodles
    Codeforces-1312E Array Shrinking
    Codeforces-1327D Infinite Path
    Codeforces-1326D Prefix-Suffix Palindrome
    HDU-5885 XM Reserves
    NTT(快速数论变换)用到的各种素数及原根
  • 原文地址:https://www.cnblogs.com/draem0507/p/3784165.html
Copyright © 2011-2022 走看看