快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。
(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了
function quickSort(arr, start = 0, end = arr.length){
if(end === start) return
if(end - start === 1){
arr[end] >= arr[start] ? null : [arr[end], arr[start]] = [arr[start], arr[end]]
return
}
// start mid end 排序
let mid = start + parseInt((end - start) / 2)
if(arr[mid] < arr[start]){
[arr[mid], arr[start]] = [arr[start], arr[mid]]
}
if(arr[end] < arr[mid] && arr[end] >= arr[start]){
[arr[end], arr[mid]] = [arr[mid], arr[end]]
}else if(arr[end] < arr[start]){
[arr[end], arr[mid]] = [arr[mid], arr[end]];// 这个冒号绝对不能去,不然和后面连在一起执行了
[arr[start], arr[mid]] = [arr[mid], arr[start]]
}
[arr[mid], arr[end - 1]] = [arr[end - 1], arr[mid]]
if(end - start === 2) return
let left = start + 1, right = end - 2
while(left !== right){
if(arr[left] <= arr[end - 1]){
left++
}else{
if(arr[right] >= arr[end - 1]){
right--
}else{
[arr[left], arr[right]] = [arr[right], arr[left]]
}
}
}
if(arr[left] >= arr[end - 1]){
[arr[end - 1], arr[left]] = [arr[left], arr[end - 1]]
}else{
[arr[end - 1], arr[left + 1]] = [arr[left + 1], arr[end - 1]]
left++
}
quickSort(arr, start, left - 1)
quickSort(arr, left + 1, end)
}