隨筆-126  評論-247  文章-5  trackbacks-0

            
          希爾排序屬于插入類排序,是將整個無序列分割成若干小的子序列分別進行插入排序。

          假如現有一數組: [49, 38, 65, 44, 81, 97, 76, 13, 27, 52, 30]

          則可以以步長為5開始對數組進行排序。為了更加直觀的表現這一過程,下面將該數組元素分成3行,并對每一列進行排序(直接插入排序)



          C++ 實現代碼片段

            
          //希爾排序
          //按自然順序
          void shellsort(Element array[], int len){
              
          int i, index, key;
              
          for(int step = len / 2; step > 0; step /= 2){  //每趟步長折半
                  for(index = step; index < len; index++){
                      key 
          = array[index];
                      
          for(i = index - step; i >= 0 && array[i] > key; i -= step){
                          array[i 
          + step] = array[i];
                      }
                      array[i 
          + step] = key;
                  }
              }
          }
            


          Java 實現代碼片段

                 
          //希爾排序,按自然順序
          public static void shellsort(int[] array){
              
          int i, index, key;
              
          for(int step = array.length / 2; step > 0; step /= 2){  //每趟步長折半
                  
          //直接插入排序
                  for(index = step; index < array.length; index++){
                      key 
          = array[index];
                      
          for(i = index - step; i >= 0 && array[i] > key; i -= step){
                          array[i 
          + step] = array[i];
                      }
                      array[i 
          + step] = key;
                  }
              }
          }
               


          C++ 實現完整代碼

             
          /**
           * <!--
           * File   : insertsort.h
           * Author : fancy
           * Email  : fancydeepin@yeah.net
           * Date   : 2013-02-05
           * --!>
           
          */
          #include 
          <stdio.h>
          #include 
          <stdlib.h>
          #define length(array) sizeof(array) / sizeof(array[0])
          #define Element int
          #define format "%d"

          //希爾排序
          //按自然順序
          void shellsort(Element array[], int len){
              
          int i, index, key;
              
          for(int step = len / 2; step > 0; step /= 2){  //每趟步長折半
                  for(index = step; index < len; index++){
                      key 
          = array[index];
                      
          for(i = index - step; i >= 0 && array[i] > key; i -= step){
                          array[i 
          + step] = array[i];
                      }
                      array[i 
          + step] = key;
                  }
              }
          }

          //遍歷數組
          void visit(Element array[], int len){
              
          for(int i = 0; i < len; i++){
                  printf(format, array[i]);
              }
          }
             

           

             
          /**
           * <!--
           * File   : InsertSort.cpp
           * Author : fancy
           * Email  : fancydeepin@yeah.net
           * Date   : 2013-02-05
           * --!>
           
          */
          #include 
          "insertsort.h"

          int main() {

              Element array[
          8= {65318724};
              
          int len = length(array);
              printf(
          "\n排序前: ");
              visit(array, len);
              printf(
          "\n希爾排序: ");
              shellsort(array, len);
              visit(array, len);
              
          /**
               * 控制臺輸出結果:
               *
               * 排序前: 65318724
               * 希爾排序: 12345678
               
          */
              
          return 0;

          }
             




          Java 實現完整代碼

             
          package net.yeah.fancydeepin.sort.insert;
          /**
           * <!--
           * Author : fancy
           * Email  : fancydeepin@yeah.net
           * Date   : 2013-02-05
           * --!>
           
          */
          public class Sort {

              
          private Sort(){}
                 
              
          //希爾排序,按自然順序
              public static void shellsort(int[] array){
                  
          int i, index, key;
                  
          for(int step = array.length / 2; step > 0; step /= 2){  //每趟步長折半
                      
          //直接插入排序
                      for(index = step; index < array.length; index++){
                          key 
          = array[index];
                          
          for(i = index - step; i >= 0 && array[i] > key; i -= step){
                              array[i 
          + step] = array[i];
                          }
                          array[i 
          + step] = key;
                      }
                  }
              }
                 
          }
             

           

             
          package test;
          /**
           * <!--
           * Author : fancy
           * Email  : fancydeepin@yeah.net
           * Date   : 2013-02-05
           * --!>
           
          */
          import net.yeah.fancydeepin.sort.insert.Sort;

          public class Test {

              
          public static void main(String[] args) {
                  
                  
          int[] array = {65318724};
                  Sort.shellsort(array);
                  
          for(int obj : array){
                      System.out.print(obj);
                  }
              }
          }
             


           



            
          posted on 2013-02-05 16:00 fancydeepin 閱讀(1162) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 灵寿县| 萝北县| 新营市| 乌审旗| 托里县| 黄梅县| 苍山县| 定西市| 海门市| 外汇| 塘沽区| 容城县| 宿州市| 彭泽县| 南安市| 宜都市| 鄱阳县| 大洼县| 敦煌市| 洪湖市| 安图县| 西乡县| 遂平县| 临猗县| 蓝山县| 西吉县| 蛟河市| 沾益县| 泽普县| 蒙阴县| 那曲县| 大丰市| 会同县| 平塘县| 西和县| 时尚| 西贡区| 金门县| 漳平市| 广昌县| 临朐县|