算法是个什么玩意儿-希尔排序

       我想希尔排序 应该算 插入排序的一个优化。把一个数组按规则分割成若干个子序列,

然后没子序列进行直接插入排序。然后缩小增量,对之前有过一次排序的数组,再分割,再进行插入排序,最后增量为1,数组基本有序了,执行最后一次 直接插入排序。

 

    下边是我从其他人的博客抄的一段话,希望对大家理解起来有所帮助。

       希尔排序的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

 

   下边是我做的测试类,一个数组是 49, 38, 65, 97, 26, 13, 27, 49, 55, 4,11。

第一趟按照 增量为5 进行分割子序列(5组),每组的下标是0 5 10; 1 6 ; 2 7 ; 3 8 ;4 9
                  然后对每组进行直接插入排序。

第二趟按照 增量为2,分割成两组 。

第三趟按照增量为1 ,也就是只分割成了1组 ,直接插入排序。

import java.util.Arrays;
public class Array {
 // 把11个数的数组,分成三组
 static void group(){
     //0 5 10; 1 6 ; 2 7 ; 3 8 ;4 9 
     int [] ia = {49, 38, 65, 97, 26, 13, 27, 49, 55, 4,11};
     // 把数组分成三组 
     int gap = ia.length/2;   
           int count = 0;
           while(count<gap){
           int i  = count;
           while(i<ia.length){ 
           System.out.println(ia[i]);
           i = i+gap;
            }
          count++;
           }
 }
 // 希尔排序
 static void shellSort(){
   int [] ia = {49, 38, 65, 97, 26, 13, 27, 49, 55, 4,11};
   System.out.println("原始数据:"+ Arrays.toString(ia));
       // 把数组分成三组 
   int gap = ia.length/2;
       // 0 5 10; 1 6 ; 2 7 ; 3 8 ;4 9 
         int count = 0;
         while (gap>=1) {
           while(count<gap) {
               int original =  count+gap; // 表示从每组的哪个下标开始进行插入排序 ,即从每组第二个下标开始的 5,6,7,8,8,9开始进行插入排序
               while(original<ia.length) {
                int current = original; // current 当前要 进行插入排序的元素的下标
                int previous  = original-gap;
              
                while(previous>=0 && (ia[previous]>ia[current])) {
                //  if() {
                    int temp ;
                    temp = ia[previous];
                    ia[previous] = ia[current] ;
                    ia[current] = temp;
                    
                    current = current-gap;
                    previous = previous-gap;
                    
                    // }
                }
                original = original+gap;
                  } //original<ia.length while end
                  count++;
              }
              System.out.println(Arrays.toString(ia)); //打印每趟循环后的元素变化
              gap = gap/2;
              count = 0;
         }    
          System.out.println("排好序的数据"+Arrays.toString(ia)); 
 }
 
 /**
  * @param args
  */
 public static void main(String[] args) {
   shellSort();
 }

有不明白大家提出问题,别忘记点赞 谢谢支持j_0028.gif

 

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