1. 程式人生 > 實用技巧 >js快速排序

js快速排序

快速排序的基本思想:通過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。

快速排序使用分治法來把一個串(list)分為兩個子串(sub-lists)。具體演算法描述如下:

  • 從數列中挑出一個元素,稱為 “基準”(pivot);
  • 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作;
  • 遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

動態展示

程式碼實現

 1 let array = randomArray(1,100);
 2 console.log(array);
 3 quickSort(0, array.length);
 4 console.log(array);
 5 function quickSort(begin,end) {
 6   if(end - begin < 2) {
 7      return;
 8   }
 9   let mid = pivotIndex(begin, end);
10   quickSort(begin,mid);
11   quickSort(mid + 1,end);
12 } 13 function pivotIndex(begin,end){ 14 let pivot = array[begin]; 15 end--; 16 while(begin < end) { 17 while(begin < end) { 18 if(pivot - array[end] < 0) { 19 end--; 20 }else{ 21 array[begin++] = array[end]; 22 break; 23 } 24 }
25 while(begin < end) { 26 if(pivot - array[begin] > 0) { 27 begin++; 28 }else{ 29 array[end--] = array[begin]; 30 break; 31 } 32 } 33 } 34 array[begin] = pivot; 35 return begin; 36 }
 1 function randomArray(start,end){
 2     var a=[],o={},random,step=end-start;
 3     while(a.length<step){
 4        random=start+parseInt(Math.random()*step);
 5        if(!o["x"+random]){
 6           a.push(random);
 7           o["x"+random]=1;
 8        };
 9     };
10     return a;
11 }