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 }
如果我的内容能对你有所帮助,我就很开心啦!