今天大概講下使用js實現快速排序算法:算法
快速排序算法的思想相似於二分法,每次都是在數組中選擇一個基數(能夠是任意一個位置的數,不過通常選擇中間的數字或者最左邊的數字),每一輪結束後,比該基數小的數都位於該基數的左邊,比該基數大的數都位於該基數的右邊。而後再分別對基數左邊和右邊的數組進行相同的操做,直到數組中只有一個元素時,返回該數組。不說了,具體上代碼(我取數組最左邊的元素做爲基數):數組
var arr=[5,7,2,9,3,8,4,7,1]; // 每次選擇最左邊的數做爲基數 function quickSort(arr){ if (arr.length<2) { return arr; } // 定義左指針 var left=0; // 定義右指針 var right=arr.length-1; //開啓每一輪的排序 while(left<right){ // 尋找右邊比arr[0]小的數的下標 while(arr[right]>=arr[0] && left<right){ right=right-1; } // 尋找左邊比arr[0]大的數的下標 while(arr[left]<=arr[0] && left<right){ left++; } //當左邊指針與右邊指針相遇後,交換arr[0]與當前兩個指針所在的元素 if (right==left) { let mid=arr[right]; arr[right]=arr[0]; arr[0]=mid; break; } // 當左指針小於右指針的位置,交換兩個指針當前位置的元素 let tem=arr[right]; arr[right]=arr[left]; arr[left]=tem; } //遞歸實現 return quickSort(arr.slice(0,left)).concat(arr.slice(left,right+1)).concat(quickSort(arr.slice(right+1))); } //對數組進行排序 console.log(quickSort(arr));
問題:爲何若是基數選擇數組最左邊元素,每次移動必須右指針先移動找到比基數小的數?同理選擇右邊,要先移動左指針?ui
回答:解決問題時能夠有時候把問題放到極限狀況下,這樣更加便於咱們直觀的觀察和分析spa
咱們假設若是基數選擇數組最左邊元素,而咱們選擇先移動左指針。若是先移動左指針,則此時左指針與右指針相遇,此時交換arr[0]與arr[right],交換後如第二張圖所示,原本交換後位於紅色7左邊的元素應該都小於等於7,可是此時8位於7的左邊,明顯不符合要求。指針