快速排序的基本思想:
基本思想是通过一趟排序将要排序的数据分割成为独立的两部分,其中一部分的所有数据都比另外一部分的所有数据要小,然后在按照此方法对这两部分数据分别进行快速排序,整个过程都可以递归进行,以此来达到整数变成有序序列
代码实现:
// 快速排序 代码实现
function quickSort (array, start,end){
let length = array.length;
// 如果不是数组或者数组长度小于等于1 直接返回,不需要排序
if(!Array.isArray(array) || length <= 1 || start >= end ) return;
let index = partition (array,start, end); // 将数组划分为两部分,并返回右部分的第一个元素的索引值
quickSort(array,start,index - 1);// 递归排序左半部分
quickSort(array,index + 1 ,end); //递归排序右半部分
}
function partition(array,start,end){
let pivot = array[start];//取得第一个值为枢纽值,获取枢纽值得大小
// 当start等于end指针时结束循环
while (start < end ){
// 当end指正指向的值大于等于枢纽值得时候,end指针向前移动
while(array [end] >= pivot && start < end){
end--;
}
// 将比枢纽值小的值交换到start的位置
array[start] = array[end];
// 移动start值,当start指针指向的值小于枢纽值得时候 start指针向后移动
while(array[start] < pivot && start < end){
start ++;
}
// 将比枢纽值打的值交换到end位置,进入下一次循环中
array[end ]= array [start];
}
// 将枢纽值交换到中间点
array[start] = pivot;
//返回中间索引值
return start;
}
这一种方法是填空发 就是 将第一个位置的数作为枢纽值,然后end指正向前移动,当遇到比枢纽值小的值或者end值等于start值的时候就停止,然后 把这个值填入start的位置。然后start指针向后移动,当遇到比枢纽值大的值或者start值等于end值的时候停止,然后将这个值填入end的位置,反复循环这个过程,知道start的值等于end的值为止,将一开始保留的这个枢纽值填入这个位置,次数枢纽值左边的值都比枢纽值小,枢纽值右边的值都比枢纽值大,然后在递归左右两边的序列。
参考文章:
[算法] 关于快速排序的四种写法