快速排序js實現

快速排序算法

今天大概講下使用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的左邊,明顯不符合要求。指針

clipboard.png

相關文章
相關標籤/搜索