排序演算法之希爾(優化冒泡)排序
阿新 • • 發佈:2019-01-24
希爾排序是用來優化其他演算法的,進行分組,初始的gap等於n/2,然後依次減半,直到最後取1.這個1有點特別,如果直接放裡面會導致死迴圈。在分組的for迴圈裡面有點不方便,所以在後面進行for迴圈程式碼修正,單獨寫變數的增值。用if來解決這個死迴圈的問題。分組後進行冒泡,進行gap分組內的值-1此冒泡,同時進行優化,否則當gap=1時就是氣泡排序了,在組內排序,每次比完就加gap,跳過的比。希爾排序的核心思想就是分組,組內排序,再分組,---越來越有序,結合之前的演算法,如果越有序就越快,來優化其他演算法。
package cn.hncu.sorts; public class SortWay2 { //輸出函式 private static void print(int[] a) { for(int num:a){ System.out.print(num+" "); } System.out.println(); } //交換陣列位置函式 private static void swap(int[] a, int j, int i) { int temp; temp=a[i]; a[i]=a[j]; a[j]=temp; } //shellSort排序 private static void shellSort(int[] a) { //進行分組,初始的gap=n/2,然後依次減半,到1為止 for (int gap=(a.length+1)/2;gap>0;) { //分組冒泡 按理來說用冒泡還要進行優化,不然當gap=1就是氣泡排序了 for (int i = 0; i < a.length-gap; i++) { //組內排序 for (int j = i; j < a.length-gap; j+=gap) { if(a[j]>a[j+gap]){ swap(a, j, j+gap); } } } //for迴圈的修正程式碼有點複雜,直接寫在for裡面不方便 單獨寫 if(gap>1){ gap=(gap+1)/2; }else if(gap==1){ break; } } } public static void main(String[] args) { int[] a={21,22,5,7,86,57,9,-2,37,-8}; //希尓排序 shellSort(a); print(a); } }