01 用js实现快速排序
快速排序(英语:Quicksort),又称分区交换排(partition-exchange sort),是一种排序算法,最早由东尼·霍尔提出。
快排步骤:
- 挑选基准值:从数列中挑出一个元素,称为“基准”(pivot)
- 分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成
- 递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序
以上文字描述摘自维基百科
首先,我们实现对数组的分割,函数代码:
function partition(arr,left,right){
//arr是要分割的数组;
//left是第一个元素的下标,我们把第一个元素定为基准;
//right是数组最后一个元素的下标
//声明一个临时变量把基准进行存储
let tmp = arr[left]
//保证至少有两个元素
while (left < right){
//while循环的作用:让right指向比基准值小的元素的下标
while (arr[right]>tmp && left<right){right--}
//将小于基准的元素移到left位置
arr[left] = arr[right]
//while循环的作用:让left指向比基准值大的元素的下标
while (arr[left]<tmp && left<right){left++}
//将大于基准的元素移到right位置
arr[right] = arr[left]
}
//随着left++ 和 right--,left和right会重合,最终跳出while循环
//把基准值移到重合的位置
arr[left] = tmp
//返回重合位置下标
return left
}
经过分割函数的作用,前面的元素都比基准值小,后面的元素都比基准值大
let arr = [7,3,2,9,4,1,13,25]
partition(arr,0,arr.length-1)
console.log(arr)
最后,通过递归对整个数组进行分割:
function quick_sort(arr,left,right){
if (left<right){
let mid = partition(arr,left,right)
//将基准值前面的所有元素进行分割
quick_sort(arr,left,mid-1)
//将基准值后面的所有元素进行分割
quick_sort(arr,mid+1,right)
}
//当所有分割函数进行到left等于right的时候,递归结束
}
完整代码如下:
<script>
function partition(arr,left,right){
let tmp = arr[left]
while (left < right){
while (arr[right]>tmp && left<right){right--}
arr[left] = arr[right]
while (arr[left]<tmp && left<right){left++}
arr[right] = arr[left]
}
arr[left] = tmp
return left
}
function quick_sort(arr,left,right){
if (left<right){
let mid = partition(arr,left,right)
quick_sort(arr,left,mid-1)
quick_sort(arr,mid+1,right)
}
}
let arr = [7,3,2,9,4,1,13,25]
quick_sort(arr,0,arr.length-1)
console.log(arr)
</script>
如有疑问,或者有不足之处,欢迎在评论区下留言讨论