1. 程式人生 > >Java八大排序演算法之"希爾排序(最小增量排序)"演算法

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)); } }

學會一種演算法,我會裝逼到底.
老鐵,你等著.