快速排序(一)

對數組進行快速排序
中心思想:
假定以數組的第一個值爲中心值,將數組中比中心值小的數值放在中心值左邊,將數組中比中心值大的數值放在中心值右邊,這樣就將數組分紅了兩個部分,再將這兩部分分別套進前面的邏輯中,完成遞歸操做,這樣確保左邊的值必定比右邊的值小(或者相等),完成排序。
二分partation 算法:(將數組分爲兩部分)算法

`
function partation(arr){數組

let midValue = arr[0];//設定數組第一個值爲中心值
 let leftIndex = 0;//左邊值索引
 let rightIndex = arr.length-1;//右邊值索引
 let leftValue = arr[leftIndex];//左邊值
 let rightVlaue = arr[rightIndex];//右邊值
 while(leftIndex < rightIndex){
     leftValue = arr[leftIndex];
     rightValue = arr[rightIndex];
     while(rightValue >= midValue && rightIndex > leftIndex){
         rightIndex--;
         rigthValue = arr[rightIndex];
     }//找出右邊比中間值小的數
     while(leftValue <= midValue && leftIndex < rightIndex){
         leftIndex++;
         leftValue = arr[leftIndex];
     }//找出左邊比中間值大的數
     //對找出的數進行交換
     let temp = arr[rightIndex];
     arr[rightIndex] = arr[leftIndex];
     arr[leftIndex] = temp;
 }
 //交換過一輪以後,將最後rightIndex所指向的值與中間值(數組第一個值)進行交換
 let temp = arr[0];
 arr[0] = arr[rightIndex];
 arr[rightIndex] = temp;
 return rightIndex;//返回中間值最後交換後所在的位置

}ui

`
經過遞歸調用partation算法,完成排序
`
function quicksort(arr){code

if(arr.length<2){
    return arr;//若是數組長度小於2 無需排序直接返回
}else{
    let midIndex=partation(arr);
    return quicksort(arr.slice(0,midIndex)).concat(arr[midIndex]).concat(quicksort(arr.slice(midIndex+1)));
}

}
`
執行:
`
console.log(quicksort(list));
`
排序完成後,會返回一個新的完成排序的數組
缺點:在排序過程當中會生成不少新的數組,佔用空間排序

在本數組中進行排序,節省空間
`
function partation(arr, start, end){遞歸

let midValue = arr[start];//肯定中間值
let rightIndex = start;//左邊索引
let rightIndex = end;//右邊索引
let leftValue = arr[leftIndex];//左邊值
let rightValue = arr[rightIndex];//右邊值
while(rightIndex > rightIndex){
    leftValue = arr[rightIndex];
    rightValue = arr[rightIndex];
    while(rightValue >= midValue && rightIndex > leftIndex){
        rightIndex--; rightValue = arr[rightIndex];
        
    }
    while(leftValue <= midValue && leftIndex<rightIndex){
        leftIndex++; leftValue = arr[leftIndex];
        
    }
    
    
    let temp = arr[leftIndex];
    arr[leftIndex] = arr[rightIndex];
    arr[rightIndex] = temp;
    
}
let temp = arr[rightIndex];
arr[rightIndex] = arr[start];
arr[start] = temp;
//console.log(arr);
return rightIndex;

}索引

`
經過遞歸對本數組進行操做io

`
function quicksort(list, start, end){console

if(end-start < 2){
    return ;
}else{
    let midIndex = partation(list, start, end);
    quicksort(list, start, midIndex);
    quicksort(list, midIndex+1, end);
}

}
`
執行:
`
quicksort(list,0,list.length-1);
console.log(list);
`function

相關文章
相關標籤/搜索