# å¿«éæåº å¿«éæåºæ¯ç±ä¸å°¼Â·éå°æåå±çä¸ç§æåºç®æ³ãå¨å¹³åç¶åµä¸ï¼æåº n 个项ç®è¦ Î(nlogn) 次æ¯è¾ã卿åç¶åµä¸åéè¦ Î(n2) 次æ¯è¾ï¼ä½è¿ç§ç¶åµå¹¶ä¸å¸¸è§ãäºå®ä¸ï¼å¿«éæåºéå¸¸ææ¾æ¯å ¶ä» Î(nlogn) ç®æ³æ´å¿«ï¼å 为å®çå é¨å¾ªç¯ï¼inner loopï¼å¯ä»¥å¨å¤§é¨åçæ¶æä¸å¾ææçå°è¢«å®ç°åºæ¥ã å¿«éæåºä½¿ç¨åæ²»æ³ï¼Divide and conquerï¼çç¥æ¥æä¸ä¸ªä¸²è¡ï¼listï¼å为两个å串è¡ï¼sub-listsï¼ã å¿«éæåºåæ¯ä¸ç§åèæ²»ä¹ææ³å¨æåºç®æ³ä¸çå ¸ååºç¨ãæ¬è´¨ä¸æ¥çï¼å¿«éæåºåºè¯¥ç®æ¯å¨å泡æåºåºç¡ä¸çéå½åæ²»æ³ã å¿«éæåºçååèµ·çæ¯ç®åç²æ´ï¼å 为ä¸å¬å°è¿ä¸ªååä½ å°±ç¥éå®åå¨çæä¹ï¼å°±æ¯å¿«ï¼è䏿çé«ï¼å®æ¯å¤çå¤§æ°æ®æå¿«çæåºç®æ³ä¹ä¸äºãè½ç¶ Worst Case çæ¶é´å¤æåº¦è¾¾å°äº O(n²)ï¼ä½æ¯äººå®¶å°±æ¯ä¼ç§ï¼å¨å¤§å¤æ°æ åµä¸é½æ¯å¹³åæ¶é´å¤æåº¦ä¸º O(n logn) çæåºç®æ³è¡¨ç°è¦æ´å¥½ï¼å¯æ¯è¿æ¯ä¸ºä»ä¹å¢ï¼æä¹ä¸ç¥éã好卿ç强迫çåç¯äºï¼æ¥äº N å¤èµæç»äºå¨ãç®æ³èºæ¯ä¸ä¿¡æ¯å¦ç«èµã䏿¾å°äºæ»¡æççæ¡ï¼ > å¿«éæåºçæåè¿è¡æ 嵿¯ O(n²)ï¼æ¯å¦è¯´é¡ºåºæ°åçå¿«æãä½å®çå¹³ææææ¶é´æ¯ O(nlogn)ï¼ä¸ O(nlogn) è®°å·ä¸éå«ç常æ°å åå¾å°ï¼æ¯å¤æåº¦ç¨³å®çäº O(nlogn) çå½å¹¶æåºè¦å°å¾å¤ãæä»¥ï¼å¯¹ç»å¤§å¤æ°é¡ºåºæ§è¾å¼±çéæºæ°åèè¨ï¼å¿«éæåºæ»æ¯ä¼äºå½å¹¶æåºã ## 1. ç®æ³æ¥éª¤ 1. 仿°å䏿åºä¸ä¸ªå ç´ ï¼ç§°ä¸º âåºåâï¼pivotï¼; 2. éæ°æåºæ°åï¼ææå ç´ æ¯åºåå¼å°çææ¾å¨åºååé¢ï¼ææå ç´ æ¯åºåå¼å¤§çæå¨åºåçåé¢ï¼ç¸åçæ°å¯ä»¥å°ä»»ä¸è¾¹ï¼ãå¨è¿ä¸ªååºéåºä¹åï¼è¯¥åºåå°±å¤äºæ°åçä¸é´ä½ç½®ãè¿ä¸ªç§°ä¸ºååºï¼partitionï¼æä½ï¼ 3. éå½å°ï¼recursiveï¼æå°äºåºåå¼å ç´ çåæ°åå大äºåºåå¼å ç´ çåæ°åæåºï¼ éå½çæåºé¨æ å½¢ï¼æ¯æ°åç大尿¯é¶æä¸ï¼ä¹å°±æ¯æ°¸è¿é½å·²ç»è¢«æåºå¥½äºãè½ç¶ä¸ç´éå½ä¸å»ï¼ä½æ¯è¿ä¸ªç®æ³æ»ä¼éåºï¼å ä¸ºå¨æ¯æ¬¡çè¿ä»£ï¼iterationï¼ä¸ï¼å®è³å°ä¼æä¸ä¸ªå ç´ æå°å®æåçä½ç½®å»ã ## 2. å¨å¾æ¼ç¤º  ## 3. JavaScript 代ç å®ç° ```js function quickSort(arr, left, right) { var len = arr.length, partitionIndex, left = typeof left != 'number' ? 0 : left, right = typeof right != 'number' ? len - 1 : right; if (left < right) { partitionIndex = partition(arr, left, right); quickSort(arr, left, partitionIndex-1); quickSort(arr, partitionIndex+1, right); } return arr; } function partition(arr, left ,right) { // ååºæä½ var pivot = left, // 设å®åºåå¼ï¼pivotï¼ index = pivot + 1; for (var i = index; i <= right; i++) { if (arr[i] < arr[pivot]) { swap(arr, i, index); index++; } } swap(arr, pivot, index - 1); return index-1; } function swap(arr, i, j) { var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } function partition2(arr, low, high) { let pivot = arr[low]; while (low < high) { while (low < high && arr[high] > pivot) { --high; } arr[low] = arr[high]; while (low < high && arr[low] <= pivot) { ++low; } arr[high] = arr[low]; } arr[low] = pivot; return low; } function quickSort2(arr, low, high) { if (low < high) { let pivot = partition2(arr, low, high); quickSort2(arr, low, pivot - 1); quickSort2(arr, pivot + 1, high); } return arr; } ``` ## 4. Python 代ç å®ç° ```python def quickSort(arr, left=None, right=None): left = 0 if not isinstance(left,(int, float)) else left right = len(arr)-1 if not isinstance(right,(int, float)) else right if left < right: partitionIndex = partition(arr, left, right) quickSort(arr, left, partitionIndex-1) quickSort(arr, partitionIndex+1, right) return arr def partition(arr, left, right): pivot = left index = pivot+1 i = index while i <= right: if arr[i] < arr[pivot]: swap(arr, i, index) index+=1 i+=1 swap(arr,pivot,index-1) return index-1 def swap(arr, i, j): arr[i], arr[j] = arr[j], arr[i] ``` ## 5. Go 代ç å®ç° ```go func quickSort(arr []int) []int { return _quickSort(arr, 0, len(arr)-1) } func _quickSort(arr []int, left, right int) []int { if left < right { partitionIndex := partition(arr, left, right) _quickSort(arr, left, partitionIndex-1) _quickSort(arr, partitionIndex+1, right) } return arr } func partition(arr []int, left, right int) int { pivot := left index := pivot + 1 for i := index; i <= right; i++ { if arr[i] < arr[pivot] { swap(arr, i, index) index += 1 } } swap(arr, pivot, index-1) return index - 1 } func swap(arr []int, i, j int) { arr[i], arr[j] = arr[j], arr[i] } ``` ## 6. C++ç ```C++ //严èæãæ°æ®ç»æãæ ååå²å½æ° Paritition1(int A[], int low, int high) { int pivot = A[low]; while (low < high) { while (low < high && A[high] >= pivot) { --high; } A[low] = A[high]; while (low < high && A[low] <= pivot) { ++low; } A[high] = A[low]; } A[low] = pivot; return low; } void QuickSort(int A[], int low, int high) //å¿«ææ¯å½æ° { if (low < high) { int pivot = Paritition1(A, low, high); QuickSort(A, low, pivot - 1); QuickSort(A, pivot + 1, high); } } ``` ## 7. Java 代ç å®ç° ```java public class QuickSort implements IArraySort { @Override public int[] sort(int[] sourceArray) throws Exception { // 对 arr è¿è¡æ·è´ï¼ä¸æ¹ååæ°å 容 int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); return quickSort(arr, 0, arr.length - 1); } private int[] quickSort(int[] arr, int left, int right) { if (left < right) { int partitionIndex = partition(arr, left, right); quickSort(arr, left, partitionIndex - 1); quickSort(arr, partitionIndex + 1, right); } return arr; } private int partition(int[] arr, int left, int right) { // 设å®åºåå¼ï¼pivotï¼ int pivot = left; int index = pivot + 1; for (int i = index; i <= right; i++) { if (arr[i] < arr[pivot]) { swap(arr, i, index); index++; } } swap(arr, pivot, index - 1); return index - 1; } private void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } ```