基本算法的Js實現【二】快速排序

 快速排序:

解析:1.採用分而治之的思想,選取一個基準,一趟排序後把數據分成兩部分,一部分都比基準小,另一部分都比基準點大,然後再對這兩部分分別進行上述的操作,直到整個序列有序。快速排序因爲數據的交換是跳躍的,所以速度比只和相鄰數據交換的冒泡排序要快,平均時間複雜度爲O(NlogN)。

2.代碼注意的點:爲什麼要哨兵j先出動?

 

舉個例子,假設讓哨兵i先動,到如上圖這一步。哨兵繼續往前走,到9的位置,發現i和j相遇,這時候你就要交換9和6的位置,排序就亂了,大於6的數出現在了左邊。原因就是哨兵j停留的位置一定比基準數大,如果讓i先走,就有可能在哨兵j的位置相遇,這時交換基準數和相遇位置就會出錯。

 

代碼如下:

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));

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章