快速排序:
解析: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));