快速排序算法,采用分治的思想,整个排序过程递归进行,实质就是选定一个数作为关键字,筛选出比此值小的数和比此值大的数这两部分数分别放在左右两边,将此值放在中间,然后对那两部分分别做此操作,直到各部分只有一个数。时间复杂度最差为O(n^2),平均时间复杂度为O(nlogn)。
var data = [6, 7, 3, 5, 4, 9, 10, 2, 8, 1];
function sort1(data, l, r) {
var f = data[l];//用f记住第一个数
var i = l;
var j = r;//左右两边分别设置两个指针
while (i < j) {
while (i < j && data[j] > f) {
j--;
} //如果右面的指针比关键字大,指针左移,否则指针停止移动,此时指针所指数值比关键字小
if (i < j) {
data[i] = data[j];//将上面筛选出的比关键字小的数放到前面
i++;//指针右移
}
while (i < j && data[i] <= f) {
i++;
} //如果左面的指针比关键字小,指针右移,否则指针停止移动,此时指针所指数值比关键字大
if (i < j) {
data[j] = data[i]; //将上面筛选出的比关键字大的数放到后面
j--; //指针左移
}
}
data[i] = f;//关键字放在正确位置
return i;
}
function quicksort(data, l, r) {
if (l > r)
return;
var temp
temp = sort1(data, l, r);
quicksort(data, l, temp - 1);
quicksort(data, temp + 1, r);
return data;
}
quicksort(data, 0, 9);
console.log(data);
排序结果
当一个数组中相同的数的个数较多时,可以对此进行改进,将相同的数放在一起,对其余不同的数的部分进行排序,三路进行,这样则可以精简排序的过程。
此算法适合于对无序的数组排序,当数组近似有序时,此算法性能较差。
网友评论