# å½å¹¶æåº å½å¹¶æåºï¼Merge sortï¼æ¯å»ºç«å¨å½å¹¶æä½ä¸çä¸ç§ææçæåºç®æ³ãè¯¥ç®æ³æ¯éç¨åæ²»æ³ï¼Divide and Conquerï¼çä¸ä¸ªéå¸¸å ¸åçåºç¨ã ä½ä¸ºä¸ç§å ¸åçåèæ²»ä¹ææ³çç®æ³åºç¨ï¼å½å¹¶æåºçå®ç°ç±ä¸¤ç§æ¹æ³ï¼ - èªä¸èä¸çéå½ï¼ææéå½çæ¹æ³é½å¯ä»¥ç¨è¿ä»£éåï¼æä»¥å°±æäºç¬¬ 2 ç§æ¹æ³ï¼ï¼ - èªä¸èä¸çè¿ä»£ï¼ å¨ãæ°æ®ç»æä¸ç®æ³ JavaScript æè¿°ãä¸ï¼ä½è ç»åºäºèªä¸èä¸çè¿ä»£æ¹æ³ã使¯å¯¹äºé彿³ï¼ä½è å´è®¤ä¸ºï¼ > However, it is not possible to do so in JavaScript, as the recursion goes too deep for the language to handle. > > ç¶èï¼å¨ JavaScript ä¸è¿ç§æ¹å¼ä¸å¤ªå¯è¡ï¼å 为è¿ä¸ªç®æ³çé彿·±åº¦å¯¹å®æ¥è®²å¤ªæ·±äºã 说å®è¯ï¼æä¸å¤ªçè§£è¿å¥è¯ãæææ¯ JavaScript ç¼è¯å¨å å太å°ï¼éå½å¤ªæ·±å®¹æé æå åæº¢åºåï¼è¿ææå¤§ç¥è½å¤ææã åéæ©æåºä¸æ ·ï¼å½å¹¶æåºçæ§è½ä¸åè¾å ¥æ°æ®çå½±åï¼ä½è¡¨ç°æ¯éæ©æåºå¥½çå¤ï¼å 为å§ç»é½æ¯ O(nlogn) çæ¶é´å¤æåº¦ã代价æ¯éè¦é¢å¤çå å空é´ã ## 2. ç®æ³æ¥éª¤ 1. ç³è¯·ç©ºé´ï¼ä½¿å ¶å¤§å°ä¸ºä¸¤ä¸ªå·²ç»æåºåºåä¹åï¼è¯¥ç©ºé´ç¨æ¥åæ¾åå¹¶åçåºåï¼ 2. 设å®ä¸¤ä¸ªæéï¼æåä½ç½®åå«ä¸ºä¸¤ä¸ªå·²ç»æåºåºåçèµ·å§ä½ç½®ï¼ 3. æ¯è¾ä¸¤ä¸ªæéææåçå ç´ ï¼éæ©ç¸å¯¹å°çå ç´ æ¾å ¥å°å并空é´ï¼å¹¶ç§»å¨æéå°ä¸ä¸ä½ç½®ï¼ 4. é夿¥éª¤ 3 ç´å°æä¸æéè¾¾å°åºåå°¾ï¼ 5. å°å¦ä¸åºåå©ä¸çææå ç´ ç´æ¥å¤å¶å°åå¹¶åºåå°¾ã ## 3. å¨å¾æ¼ç¤º  ## 4. JavaScript 代ç å®ç° ```js function mergeSort(arr) { // éç¨èªä¸èä¸çé彿¹æ³ var len = arr.length; if(len < 2) { return arr; } var middle = Math.floor(len / 2), left = arr.slice(0, middle), right = arr.slice(middle); return merge(mergeSort(left), mergeSort(right)); } function merge(left, right) { var result = []; while (left.length && right.length) { if (left[0] <= right[0]) { result.push(left.shift()); } else { result.push(right.shift()); } } while (left.length) result.push(left.shift()); while (right.length) result.push(right.shift()); return result; } ``` ## 5. Python 代ç å®ç° ```python def mergeSort(arr): import math if(len(arr)<2): return arr middle = math.floor(len(arr)/2) left, right = arr[0:middle], arr[middle:] return merge(mergeSort(left), mergeSort(right)) def merge(left,right): result = [] while left and right: if left[0] <= right[0]: result.append(left.pop(0)); else: result.append(right.pop(0)); while left: result.append(left.pop(0)); while right: result.append(right.pop(0)); return result ``` ## 6. Go 代ç å®ç° ```go func mergeSort(arr []int) []int { length := len(arr) if length < 2 { return arr } middle := length / 2 left := arr[0:middle] right := arr[middle:] return merge(mergeSort(left), mergeSort(right)) } func merge(left []int, right []int) []int { var result []int for len(left) != 0 && len(right) != 0 { if left[0] <= right[0] { result = append(result, left[0]) left = left[1:] } else { result = append(result, right[0]) right = right[1:] } } for len(left) != 0 { result = append(result, left[0]) left = left[1:] } for len(right) != 0 { result = append(result, right[0]) right = right[1:] } return result } ``` ## 7. Java 代ç å®ç° ```java public class MergeSort implements IArraySort { @Override public int[] sort(int[] sourceArray) throws Exception { // 对 arr è¿è¡æ·è´ï¼ä¸æ¹ååæ°å 容 int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); if (arr.length < 2) { return arr; } int middle = (int) Math.floor(arr.length / 2); int[] left = Arrays.copyOfRange(arr, 0, middle); int[] right = Arrays.copyOfRange(arr, middle, arr.length); return merge(sort(left), sort(right)); } protected int[] merge(int[] left, int[] right) { int[] result = new int[left.length + right.length]; int i = 0; while (left.length > 0 && right.length > 0) { if (left[0] <= right[0]) { result[i++] = left[0]; left = Arrays.copyOfRange(left, 1, left.length); } else { result[i++] = right[0]; right = Arrays.copyOfRange(right, 1, right.length); } } while (left.length > 0) { result[i++] = left[0]; left = Arrays.copyOfRange(left, 1, left.length); } while (right.length > 0) { result[i++] = right[0]; right = Arrays.copyOfRange(right, 1, right.length); } return result; } } ``` ## 8. PHP 代ç å®ç° ```php function mergeSort($arr) { $len = count($arr); if ($len < 2) { return $arr; } $middle = floor($len / 2); $left = array_slice($arr, 0, $middle); $right = array_slice($arr, $middle); return merge(mergeSort($left), mergeSort($right)); } function merge($left, $right) { $result = []; while (count($left) > 0 && count($right) > 0) { if ($left[0] <= $right[0]) { $result[] = array_shift($left); } else { $result[] = array_shift($right); } } while (count($left)) $result[] = array_shift($left); while (count($right)) $result[] = array_shift($right); return $result; } ```