一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 用Java實現希爾排序的示例

用Java實現希爾排序的示例

2019-10-20 23:13java教程網 Java教程

問題:現有一段程序S,可以對任意n個數進行排序。如果現在需要對n^2個數進行排序,最少需要調用S多少次?只允許調用S,不可以做別的操作。我們用希爾排序來做解決這個

一.理論準備
 希爾排序(Shell Sort)是插入排序的一種,是針對直接插入排序算法的改進,是將整個無序列分割成若干小的子序列分別進行插入排序,希爾排序并不穩定。該方法又稱縮小增量排序,因DL.Shell于1959年提出而得名。
基本思想:先取一個小于n的整數d1作為第一個增量,把文件的全部記錄分成d1個組。所有距離為d1的倍數的記錄放在同一個組中。先在各組內進行直接插入排序;然后,取第二個增量d2<d1重復上述的分組和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有記錄放在同一組中進行直接插入排序為止。
希爾排序的時間性能優于直接插入排序的原因: 
①當文件初態基本有序時直接插入排序所需的比較和移動次數均較少。 
②當n值較小時,n和n2的差別也較小,即直接插入排序的最好時間復雜度O(n)和最壞時間復雜度0(n2)差別不大。 
③在希爾排序開始時增量較大,分組較多,每組的記錄數目少,故各組內直接插入較快,后來增量di逐漸縮小,分組數逐漸減少,而各組的記錄數目逐漸增多,但由于已經按di-1作為距離排過序,使文件較接近于有序狀態,所以新的一趟排序過程也較快。 
 因此,希爾排序在效率上較直接插人排序有較大的改進。
增量序列的選擇:Shell排序的執行時間依賴于增量序列。 
好的增量序列的共同特征(查到的資料都這么講): 
① 最后一個增量必須為1; 
② 應該盡量避免序列中的值(尤其是相鄰的值)互為倍數的情況。      
看到了這個,我想試試希爾排序,就學學。

復制代碼代碼如下:


public class ShellSort {
 public static void main(String[] args) {

  int[] arr = new int[]{44,33,99,10,30,20,59,78,23,48};
  System.out.print("排序前:");
  for(int o: arr) {
   System.out.print(o+" ");
  }
  System.out.println();
  shellSort(arr);
  System.out.print("排序后:");
  for(int o: arr) {
   System.out.print(o+" ");
  }
  System.out.println();
 }
 private static void shellSort(int[] arr) {

  int j;
  int len = arr.length;
  for(int val=len>>1; val>0; val>>=1) {
   //下面是對本次的所有分組做直接插入排序
   for(int i=val; i<len; i++) {
    int temp = arr[i];
    /*
     * 為什么每次都用temp比較呢?
     * 因為直接插入就是找到temp的合適位置。
     * 為什么temp<arr[j-val]這個條件可以放在for內呢?
     * 因為原來的組內數據已經有序,找到位置就停止便是。
     * 不甚理解的去看直接插入排序吧。
     */
    for(j=i; j>=val&&temp<arr[j-val]; j-=val) {
     /*
      * 為什么是arr[j-val]不是arr[j]呢?
      * 因為j=i開始的,而且條件是j>=val&&temp<arr[j-val]
      */
     arr[j] = arr[j-val];
    }
    /*
     * 注意不是arr[i] = temp
     * 直接插入排序也是這樣的。
     * 為什么呢?
     * 因為j是位置,i是待插入元素
     */
    arr[j] = temp;
   }
  }
 }
}


三.問題
希爾排序一定正確么?換句話說如何選取增量序列才能保證正確(包括長度、值)?是的,最后一次只要保證增量是1就ok(不管序列長度,只不過效率就低了),若是序列只有1,那就是直接插入排序了,不知道對否。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女福利网站 | 男女xxoo做爰猛烈动态一 | 扒开腿开嫩苞 | 午夜久久久久久亚洲国产精品 | 亚洲 欧美 国产 综合久久 | 91精品国产91热久久久久福利 | 免费国产一级 | 肥胖女性大bbbbbb视频女厕 | 蜜桃影像传媒推广 | porno美国xxxx | 天天躁天天碰天天看 | 免费理伦片在线观看全网站 | 欧美女孩videos | ai换脸明星造梦工厂忘忧草 | 沉沦艳妇杨幂肉体小说 | 91chinese 永久免费 | 国产里番 | 成人久久18免费网站入口 | 国产精品久久久久久久久免费观看 | 亚洲国产在线播放 | 动漫在线观看h | 精品国产品香蕉在线观看75 | 亚洲精品私拍国产福利在线 | 久久aa毛片免费播放嗯啊 | 国产日产国无高清码2020 | bt7086新片速递亚洲最新合集 | 91青青国产在线观看免费 | 热99re久久精品国产首页 | 午夜精品久久久久 | 亚州综合网 | 国产第一自拍 | 国产精品国产三级国产专区不 | 玩乳h文奶水和尚 | 高肉h护士办公室play | 娇小老少配xxxxx性视频 | α片免费| 国产精品模特hd在线 | 四虎影院免费在线播放 | 免费亚洲视频 | 国产区成人精品视频 | 九九精品免视看国产成人 |