Java程式碼 希爾排序
每天都更,最近再研究演算法,希望能夠把演算法搞明白
希爾排序的思想
其實就是分組的插入排序
先將整個待排序列分割成若干子序列,然後依次根據縮減增量進行排序
如下舉例:
n=12; 15 26 5 39 19 38 10 3 58 78 9 98
第一次 gap=12/2=6
15 26 5 39 19 38 10 3 58 78 9 98
1A 2A 3A 4A 5A 6A 1B 2B 3B 4B 5B 6B
分成了六組分別是(15,10)(26,3)(5,58)(39,78)(19,9)(38,98)
第二次 gap=6/2=3
15 26 5 39 19 38 10 3 58 78 9 98
排完序之後為:
10 3 5 39 9 38 15 26 58 78 19 98
1A 2A 3A 1B 2B 3B 1C 2C 3C 1D 2D 3D
分成3組分別是(10,39,15,78)(3,9,26,19)(5,38,58,98)
第三次 gap=3/2=1
排序完成後
10 3 5 15 9 38 39 19 58 78 26 98
1A 1B 1C 1D 1E 1F 1G 1H 1I 1J 1K 1L
分成一組
再進行一次插入排序即可 因為在元素基本有序的情況下 插入排序的效率高
完成排序之後
3 5 9 10 15 19 26 38 39 58 78 98
Java程式碼如下
package sort;
//希爾排序
//2015-05-30
public class ShellSort {
//第一種方式 希爾排序完全按照定義來寫
// public void ShellSort1(int a[],int n){
// int i,j,gap;
// for(gap=n/2;gap>0;gap/=2){
// for(i=0;i<gap;i++){
// for(j=i+gap;j<n;j+=gap){
// if(a[j]<a[j-gap]){
// int temp=a[j];
// int k;
// for( k=j-gap;k>=0&&a[k]>temp;k-=gap){
// a[k+gap]=a[k];
// }
// a[k+gap]=temp;
// }
// }
// }
// }
// }
//第二種方式 希爾排序程式碼優化,每次都從陣列的第gap個元素開始進行插入排序
// public void ShellSort2(int a[],int n){
// int j,gap;
// for(gap=n/2;gap>0;gap/=2){
// for(j=gap;j<n;j++){
// if(a[j]<a[j-gap]){
// int temp=a[j];
// int k=j-gap;
// while(k>=0&&a[k]>temp){
// a[k+gap]=a[k];
// k-=gap;
// }
// a[k+gap]=temp;
// }
// }
// }
// }
//第三種方式 插入排序簡化一下
public void ShellSort3(int a[],int n){
int i,j,gap;
for(gap=n/2;gap>0;gap/=2){
for(i=gap;i<n;i++){
for(j=i-gap;j>=0&&a[j]>a[j+gap];j-=gap){
swap(a,j,j+gap);
}
}
}
}
//交換方法
public void swap(int a[],int p,int q ){
int k;
k=a[p];
a[p]=a[q];
a[q]=k;
}
}