Java八大排序演算法之"希爾排序(最小增量排序)"演算法
希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。該方法因DL.Shell於1959年提出而得名。
———————-本段來自百度百科
是插入排序的一種,只不過是效率更高.就能獨立成一種演算法….作為小菜鳥的我來說:
先給自己定個小目標,比如說寫一個屬於自己的演算法.
拉倒吧,但是我倒是想到了一個把妹的紙牌遊戲.
就是用13張不同的牌,其實不管多少張,只要不同數字就ok,然後,和前面的妹子互動排序.你每次拿起來兩張牌只需要問誰大誰小,然後就可以用希爾演算法排序了.
慎重的說一下,因為會互動很多次才能排序出來,要麼少選幾張牌(太少了就沒有技術含量了),要麼,別玩了,你們還有重要的故事要繼續—>>>>康忙北鼻…
等我找個毛巾捂臉(✿◡‿◡)
對希爾演算法,就是
先知道這個陣列的長度n,
所以,它的一半就是n/2,如果不能整除就向上取整;
第一輪:先將資料分成兩組,個數是奇數的話,向上取整.
取出來第一組的第一個數,和第二組的第一個數比較
取出來第一組的第二個數,和第二組的第二個數比較
….對應的位置比較
第一輪結束.
第二輪,根據第一輪的一半(可能向上取整了)的一半分組(第二輪不會有向上取整,肯定是偶數,1除外….);
又是第一輪的方法,取出來新的第一組的第一個數,先與第二組的第一個數比較,第一個數字大了就和第二組的第一個數互換位置.
比完了後,又將第二組的第一個數和第三組的第一個數比較.
以此類推….比到最後一個沒得比了,
拿就從第一組中取出來第二個數,按照上面的方法開始往下比較…
……
……
直到>>>一半的一半的一半…等於1,就按照順序,第一個,第二個比較看是否要換位置後,又將第二個與第三個進行比較…
比較完了就拍好序了…
妹子說,這個遊戲好無聊,我不玩了.
分手 >>> /(ㄒoㄒ)/~~
程式設計師,活該你單身.哈哈哈
看到這麼多,你肯定會蒙圈的,自己找幾張撲克牌模擬一下吧.
如果是在公司的話,那就多輸出一下日誌就好了,我就是這麼幹的….哈哈哈
package com.wangjun.sort;
import java.util.Arrays;
/**
* 希爾排序(最小增量排序)
* 基本思想:
* 演算法先將要排序的一組數按某個增量 d(n/2,n為要排序數的個數)分成若干組,
* 每組中記錄的下標相差 d.對每組中全部元素進行直接插入排序,
* 然後再用一個較小的增量(d/2)對它進行分組,
* 在每組中再進行直接插入排序。
* 當增量減到 1時,進行直接插入排序後,排序完成。
*
* @author 王俊
*
*/
public class ShellSort {
public static void main(String[] args) {
int[] a={49,38,65,95,25,53,51};
System.out.println(Arrays.toString(a));
System.out.println("=======================");
sort(a);
}
/**
* 用希爾演算法進行排序
* @param a 需要排序的陣列
*/
private static void sort(int[] a) {
double d1=a.length;
int temp=0;
//開始迴圈
while(true){
//ceil 則是不小於他的最小整數
//每迴圈一次,增量就減半向上取整
d1=Math.ceil(d1/2);
int d=(int)d1;
//開始進行遍歷陣列分割出來的第一部分
for(int x=0;x<d;x++){
//
System.out.println("-------"+d+"--------");
for(int i=(x+d);i<a.length;i+=d){
int j=(i-d);
temp=a[i];
System.out.println("i=="+i);
System.out.println("temp=="+temp);
System.out.println("j=="+j);
System.out.println("a[j]=="+a[j]);
for(;j>=0 && temp<a[j];j-=d){
a[j+d]=a[j];
}
a[j+d]=temp;
}
System.out.println(Arrays.toString(a));
}
//當d==1的時候跳出死迴圈
if(d==1){
break;
}
}
//System.out.println(Arrays.toString(a));
}
}
學會一種演算法,我會裝逼到底.
老鐵,你等著.