// 交换函数
function swap(arr, a, b){
var temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
// 快速排序
// 返回 p 保证 arr[l...p-1] < arr[p] 且 arr[p+1...r] > arr[p]
function Partition(arr, l, r){
var i,j,k;
// j 代表
i=j=l;
for(k=l+1; k<=r; k++){
if(arr[k] < arr[i]){
j++;
swap(arr,j, k)
}
}
swap(arr, j, i)
return j;
}
function QuickSort(arr, l, r) {
if(l >= r) {
return ;
}
var p = Partition(arr, l, r);
QuickSort(arr, l, p-1);
QuickSort(arr, p+1, r);
}
快速排序主要思想是 在Partition函数上
设置了两个k,j
k 表示的是遍历的当前元素的位置
j 表示的是大于一个元素 和 小于第一个元素的 边界
p 保证 arr[l...p-1] < arr[p] 且 arr[p+1...r] > arr[p]
快速排序是nlog(n)级别的排序算法,其排序时间也是很快的l
// 当数组元素中有大量的元素 是一样的情况下
// 会导致快排的时候一端 变得非常长 而另一端变得很短
// 这时如果重新改变 Partition函数 尤为重要
function Partition2(arr, l, r){
var i,j;
// 保证 [l+1...i) <= arr[l]
// [j...r] >= arr[l]
swap(arr, l, Math.floor(Math.random()*(r-l+1))+l);
i= l+1;
j = r;
while(true){
while( i <= r && arr[i] < arr[l]) { i++; }
while( j >= l+1 && arr[j] > arr[l]) { j--; }
if( i > j) {
break;
}
swap(arr, i, j)
i++;
j--;
}
swap(arr, l, j)
return j;
}
function QuickSort2(arr, l, r) {
if(l >= r) {
return ;
}
var p = Partition2(arr, l, r);
QuickSort(arr, l, p-1);
QuickSort(arr, p+1, r);
}