希爾排序(縮小增量排序)


希爾排序

-- 插入排序中的一種,也叫縮小增量排序,是不穩定排序。 適用於順序存儲

 

排序思想

1、將亂序元素分成 d1 組(組內元素和往后數d1個的元素為一組,每一組組內元素並不相鄰)

2、對每一分組內元素進行直接插入排序

3、將全部元素再分成 d1/2 組(取下界)

4、對每一分組元素進行直接插入排序

5、再分組,重復上述步驟直到 d=1

 

d一般取長度的一半(取下界)   例 7個元素,則 d1 = 7/2 (取下界)  d1=3

 

#:  3  6  5  2  5  1  4  7個元素分為3組, d1=3 (相應元素往后數 3 個為一組),相同顏色的元素為一組,對 [3,2,4] [6,5] [5,1] 分別進行插入排序

得到  2  5  1  3  6  5  4  

 

->  2  5  1  3  6  5  4  d2 = 3/2(取下界)d2 = 1 ,縮小增量, 對整個序列分別進行插入排序

得到  1  2  3  4  5  5  6

 

其中在第一次排序的時候,由於分組, 第一個5 和第二個 5 交換了位置,因此,希爾排序是不穩定的排序。

 

 

import java.util.Arrays;

public class ShellsSort{
    public static void main(String[] args) {
        int[] arr = {5, 7, 8, 4, 2, 7, 1, 8, 12, 25, 10};
        shellsSort(arr, arr.length);
    }

    public static void shellsSort(int[] arr, int n) {
        //三層循環。分組——組內插入排序
        int i,j,group;
        int count = 0;

        for(group=n/2; group>0; group/=2){            //分組  

            for(i = group; i<n; i+=group){               //分的組就循環次數,也代表每組第一個元素所在位置
                int temp = arr[i];
                for(j=i; j>0 && arr[j-group]>temp; j-=group){       //插入排序,要記住中間隔了group個元素
                    arr[j] = arr[j-group];
                }
                arr[j] = temp;
            }

            count++;
            System.out.println(""+(count)+"次排序之后,元素序列為:"+Arrays.toString(arr));
            
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM