js快速排序
阿新 • • 發佈:2020-10-26
快速排序的基本思想:通過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。
快速排序使用分治法來把一個串(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 }