標籤:
希爾排序簡述
希爾排序是基於插入排序的以下兩點性質而提出改進方法的:
- 插入排序在對幾乎已經排好序的資料操作時,效率高,即可以達到線性排序的效率。(希爾排序先將部分資料進行排序,相當於已經部分排好序)
- 但插入排序一般來說是低效的,因為插入排序每次只能將資料移動一位。(希爾排序先將間隔大的資料進行大的移位,後期的移位距離相對要小很多)
分析:
先去一個小於n的整數的H作為第一個增量,把檔案的全部記錄分組。即將所有距離為H的倍數的記錄放在同一個族中,先在各組內進行直接插入排序;然後去第二個增量重複上述的分組和排序,直至所取的增量為1。
例子:對7、10、1、9、2、5、8、6、4、3數組進行一增量為4的希爾排序過程,數組可以看成是由4個字數組組成(0、4、8)(1、5、9)(2、6)(3、7)。
後面如果取增量為1的話,就是對整個數組進行插入排序。
希爾排序的優點就是減少了插入排序的資料的大量複製和移動,同時也是效率得到了很大的提高。
實現代碼:
希爾排序類:
package com.dxx.order;import java.util.ArrayList;public class ShellSort {private int arrs[];//設定增量數組,公式為h=3*h+1,eg:1、4、13、40....找到接近數組長度但是小於它的增量為止private ArrayList<Integer> rises = new ArrayList<Integer>();public ShellSort(int[] arrs) {super();this.arrs = arrs;}//定義增量數組public void setRises(){int len = arrs.length;int h = 1;int count=0;while(true){if(h>=len){break;}rises.add(h);h = 2*h + 1;}}public void sortArrs(){int h,temp,len = rises.size();//根據增量依次進行排序for(int i=0; i<len;i++){h = rises.get(len-1-i);//對增量為h的數組進行排序arrs[h]for(int k=h;k<arrs.length;k++){//以冒泡排序的方式對一個增量為h的數組進行排序if(arrs[k]<arrs[k-h]){temp = arrs[k];while(k>=h && temp<arrs[k-h]){arrs[k] = arrs[k-h];k-=h;}arrs[k] = temp;k+=h;}}}}public void sortArrs2(){int group, i, j, temp;int len = arrs.length; for (group = len / 2; group > 0; group /= 2) { for (i = group; i < len; i++) { for (j = i - group; j >= 0; j -= group) { if (arrs[j] > arrs[j + group]) { temp = arrs[j]; arrs[j] = arrs[j + group]; arrs[j + group] = temp; } } } }}public void printArrs(){for(int i :arrs){System.out.print(i + " ");}System.out.println();}}
主程式類:
package com.dxx.order;public class MainTest {public static void main(String[] args) {int arrs[] = {14,3,2,5,12,8,6,7,10,11,1,9,13};ShellSort shellSort = new ShellSort(arrs);shellSort.printArrs();shellSort.setRises();shellSort.sortArrs();shellSort.printArrs();}}
希爾排序java