快速排序,之前一直是按廖雪峰老师的一个案例来做的,知道看到一个博主转的一篇对比的文章,才开始用这种方式来做,并找出了那个新案例中的一个bug并改了,那篇对比文章找不到了,如果之后能再次看到会在本文后面加上。请指教
var arrayMain = [35, 45, 198, 46, 5, 91, 18, 44, 141, 12, 79, 40, 39, 88, 8, 2, 100, 21, 122, 3, 76, 28, 19, 62]
// 这里对比排序并返回中间数下标
function jisuan(list, start, end) {
if (start >= end) return list
var baseIndex = Math.floor((start + end) / 2), // 向上四舍五入, 取一个中间数下标,把数组分成左右两个部分
i = start,
j = end,
baseIndexMain = list[baseIndex]; // 这里为什么要单独吧这个基数拎出来, 是为了防止第一次换位就把基数本身给换掉了,(那就失去了已这个基数为基准,把小的放左边,大的放右边这个原则了)
while (i<=j) {
while (list[i] < baseIndexMain ) { // 在数组的左边区域找出一个比中间数大的,准备换到右边去;
i++;
}
while (list[j] > baseIndexMain) { // 在数组的右边区域找出一个比中间数小的,准备换到左边去;
j--;
}
if (i<=j) { // 两个位置的数值 互换,然后进行下一个循环
var temp = list[i];
list[i] = list[j];
list[j] = temp;
i++;
j--;
}
}
return i;
}
// 设计一个排序循环,
function xunhuan(list, start, end) {
if (list.length < 1) {
return list;
}
var index = jisuan(list, start, end) //
if (start < index - 1) {
xunhuan(list, start, index - 1); //
}
if(end > index) {
xunhuan(list, index, end);
}
return list
}
console.log(xunhuan(arrayMain, 0, arrayMain.length - 1))
// [2, 3, 5, 8, 12, 18, 19, 21, 28, 35, 39, 40, 44, 45, 46, 62, 76, 79, 88, 91, 100, 122, 141, 198]