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