快速排序-直取基准下标

117 阅读2分钟

快速排序,之前一直是按廖雪峰老师的一个案例来做的,知道看到一个博主转的一篇对比的文章,才开始用这种方式来做,并找出了那个新案例中的一个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]