從排序算法看起

本文擬分析各排序算法的優劣性。主要分析冒泡排序,堆排序的操作與熵的變化。

也許涉及機器學習在排序算法研究中的應用。也稍微聊聊人生與合理社區發展的一些想法。

 

算了下冒泡排序的熵變化情況。

效率低的原因是信息沒有複用。

如果改爲分組歸併,那麼第一輪的信息都是獨立的,熵減少平均是常數:ln2。

對於冒泡,第一輪平均是(ln2+ln3/2+...+lnn/(n-1))/(n-1)=lnn/(n-1),這個就差太遠了。

 

已知任意比較排序級別最優是nlnn複雜度,對於ln(n!)就是這個級別,平均每步熵減要達到1,或者是常數。

由此看,冒泡效率低太正常了。歸併就常數了,效率高很正常。

堆排序就更好了,每一次的信息都比較好的保存下來了。

 

簡單計算堆的各種情況。

第一行表示2^t-1個元素的堆的個數的位數,第二行表示去除對稱情況的個數的位數,第三行表示階乘的位數。

可以看出來,基本上數字很大。即時考慮去重情況,還是很大。這就意味着通過第一步的建堆操作,減小的只是很小一部分。

不會對複雜度有影響。也就是說複雜度還是nlnn。

2 :res = 2
2 :res = 1
2 :res = 4
3 :res = 8
3 :res = 6
3 :res = 13
4 :res = 23
4 :res = 21
4 :res = 34
5 :res = 64
5 :res = 61
5 :res = 88
6 :res = 164
6 :res = 160
6 :res = 214
7 :res = 403
7 :res = 398
7 :res = 505
8 :res = 957
8 :res = 952
8 :res = 1164
9 :res = 2220
9 :res = 2215
9 :res = 2637
10 :res = 5054
10 :res = 5048
10 :res = 5891
11 :res = 11338
11 :res = 11331
11 :res = 13016
12 :res = 25139
12 :res = 25132
12 :res = 28500
13 :res = 55208
13 :res = 55200
13 :res = 61932
14 :res = 120276
14 :res = 120267
14 :res = 133730
15 :res = 260277
15 :res = 260267
15 :res = 287189
16 :res = 560006
16 :res = 559997
16 :res = 613837
17 :res = 1198922
17 :res = 1198912
17 :res = 1306588
18 :res = 2555667
18 :res = 2555656
18 :res = 2771005

 

      int N = 20;
      BigInteger two = BigInteger.ONE.multiply(new BigInteger("2"));
      BigInteger one = BigInteger.ONE;

      BigInteger[] res = new BigInteger[N];
      for (int i = 0; i < N; i++) {
        if (i == 0) {
          res[i] = BigInteger.ONE;
        } else if (i == 1) {
          res[i] = two;
        } else {
          BigInteger t = fac(two.pow(i + 1).subtract(two), two.pow(i).subtract(one));
          res[i] = res[i - 1].multiply(res[i - 1]).multiply(t);
          System.out.println(i + " :res = " + res[i].toString().length());
          System.out.println(i + " :res = " + res[i].divide(two.pow(2*i+1)).toString().length());
          System.out.println(i + " :res = " + fac0(two.pow(i + 1).subtract(one)).toString().length());
        }
      }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章