# å¸å°æåº å¸å°æåºï¼ä¹ç§°éåå¢éæåºç®æ³ï¼æ¯æå ¥æåºçä¸ç§æ´é«æçæ¹è¿çæ¬ãä½å¸å°æåºæ¯éç¨³å®æåºç®æ³ã å¸å°æåºæ¯åºäºæå ¥æåºç以ä¸ä¸¤ç¹æ§è´¨èæåºæ¹è¿æ¹æ³çï¼ - æå ¥æåºå¨å¯¹å ä¹å·²ç»æå¥½åºçæ°æ®æä½æ¶ï¼æçé«ï¼å³å¯ä»¥è¾¾å°çº¿æ§æåºçæçï¼ - ä½æå ¥æåºä¸è¬æ¥è¯´æ¯ä½æçï¼å 为æå ¥æåºæ¯æ¬¡åªè½å°æ°æ®ç§»å¨ä¸ä½ï¼ å¸å°æåºçåºæ¬ææ³æ¯ï¼å å°æ´ä¸ªå¾ æåºçè®°å½åºååå²æä¸ºè¥å¹²ååºååå«è¿è¡ç´æ¥æå ¥æåºï¼å¾ æ´ä¸ªåºåä¸çè®°å½âåºæ¬æåºâæ¶ï¼åå¯¹å ¨ä½è®°å½è¿è¡ä¾æ¬¡ç´æ¥æå ¥æåºã ## 1. ç®æ³æ¥éª¤ 1. éæ©ä¸ä¸ªå¢éåºå t1ï¼t2ï¼â¦â¦ï¼tkï¼å ¶ä¸ ti > tj, tk = 1ï¼ 2. æå¢éåºåä¸ªæ° kï¼å¯¹åºåè¿è¡ k è¶æåºï¼ 3. æ¯è¶æåºï¼æ ¹æ®å¯¹åºçå¢é tiï¼å°å¾ æåºåå岿è¥å¹²é¿åº¦ä¸º m çååºåï¼åå«å¯¹åå表è¿è¡ç´æ¥æå ¥æåºãä» å¢éå å为 1 æ¶ï¼æ´ä¸ªåºåä½ä¸ºä¸ä¸ªè¡¨æ¥å¤çï¼è¡¨é¿åº¦å³ä¸ºæ´ä¸ªåºåçé¿åº¦ã ## 2. JavaScript 代ç å®ç° ```js function shellSort(arr) { var len = arr.length, temp, gap = 1; while(gap < len/3) { //卿å®ä¹é´éåºå gap =gap*3+1; } for (gap; gap > 0; gap = Math.floor(gap/3)) { for (var i = gap; i < len; i++) { temp = arr[i]; for (var j = i-gap; j >= 0 && arr[j] > temp; j-=gap) { arr[j+gap] = arr[j]; } arr[j+gap] = temp; } } return arr; } ``` ## 3. Python 代ç å®ç° ```python def shellSort(arr): import math gap=1 while(gap < len(arr)/3): gap = gap*3+1 while gap > 0: for i in range(gap,len(arr)): temp = arr[i] j = i-gap while j >=0 and arr[j] > temp: arr[j+gap]=arr[j] j-=gap arr[j+gap] = temp gap = math.floor(gap/3) return arr } ``` ## 4. Go 代ç å®ç° ```go func shellSort(arr []int) []int { length := len(arr) gap := 1 for gap < gap/3 { gap = gap*3 + 1 } for gap > 0 { for i := gap; i < length; i++ { temp := arr[i] j := i - gap for j >= 0 && arr[j] > temp { arr[j+gap] = arr[j] j -= gap } arr[j+gap] = temp } gap = gap / 3 } return arr } ``` ## 5. Java 代ç å®ç° ```java public class ShellSort implements IArraySort { @Override public int[] sort(int[] sourceArray) throws Exception { // 对 arr è¿è¡æ·è´ï¼ä¸æ¹ååæ°å 容 int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); int gap = 1; while (gap < arr.length) { gap = gap * 3 + 1; } while (gap > 0) { for (int i = gap; i < arr.length; i++) { int tmp = arr[i]; int j = i - gap; while (j >= 0 && arr[j] > tmp) { arr[j + gap] = arr[j]; j -= gap; } arr[j + gap] = tmp; } gap = (int) Math.floor(gap / 3); } return arr; } } ```