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