js快速排序算法最简单写法
快速排序是一种分治算法,它可以在O(nlogn)的时间复杂度中对一个无序数组进行排序。它基于一种简单的思路:选择一个基准元素,将数组中小于基准的部分和大于基准的部分分别放置在其左右两侧,然后再对左右两侧进行递归排序。在这个过程中,每次都会有一个元素被排序到了其最终位置,直到数组被完全排序。
下面我们来看看如何用最简单的方式来实现JavaScript中的快速排序算法。
步骤1:编写主函数
首先需要编写一个主函数来调用快速排序算法。在JavaScrip中,使用Function实现主函数的定义。我们可以将排序的数组作为函数的参数,并且将左右两侧的索引也作为参数传入,最终返回排好序的数组。
function quickSort(arr, left, right) {
//排序结束条件
if (left >= right) {
return
}
}
步骤2:确定基准元素
在每次递归过程中,我们需要选择一个基准元素来进行分割。最常用的选择方式是将数组中的第一个元素作为基准元素。在这个过程中,我们需要将数组中小于基准元素的部分放在基准元素左边,大于基准元素的部分放在基准元素的右边。
function quickSort(arr, left, right) {
//排序结束条件
if (left >= right) {
return
}
//选取基准
let pivot = arr[left]
}
步骤3:进行分割
接着,我们需要将数组进行分割。我们需要定义两个指针,一个左指针指向数组开头,一个右指针指向数组结尾。如果左指针指向的元素小于等于基准元素,就将左指针往右移动一位;如果右指针指向的元素大于等于基准元素,就将右指针往左移动一位。如果左指针指向的元素大于基准元素,右指针指向的元素小于基准元素,交换两个元素的位置。循环以上操作,直到左指针大于右指针为止。最后,将基准元素的位置和左指针的位置交换。
function quickSort(arr, left, right) {
//排序结束条件
if (left >= right) {
return
}
//选取基准
let pivot = arr[left]
let i = left + 1
let j = right
while (i <= j) {
while (arr[i] < pivot && i <= j) {
i++
}
while (arr[j] > pivot && i <= j) {
j--
}
if (i < j) {
[arr[i], arr[j]] = [arr[j], arr[i]]
}
}
//将基准元素和左指针交换
[arr[left], arr[j]] = [arr[j], arr[left]]
}
步骤4:递归排序左右两侧
到目前为止,我们已经完成了一次分割,将数组分成了左右两侧。接下来,我们需要递归对左右两侧进行排序。对于左侧部分,左指针变为left,右指针变为j-1;对于右侧部分,左指针变为j+1,右指针变为right。
function quickSort(arr, left, right) {
//排序结束条件
if (left >= right) {
return
}
//选取基准
let pivot = arr[left]
let i = left + 1
let j = right
while (i <= j) {
while (arr[i] < pivot && i <= j) {
i++
}
while (arr[j] > pivot && i <= j) {
j--
}
if (i < j) {
[arr[i], arr[j]] = [arr[j], arr[i]]
}
}
//将基准元素和左指针交换
[arr[left], arr[j]] = [arr[j], arr[left]]
//递归排序左右两侧sort函数 js
quickSort(arr, left, j-1)
quickSort(arr, j+1, right)
}
步骤5:测试代码
上面的步骤已经完成了快速排序算法的实现。我们可以编写一个测试函数来检查代码是否正确。
function testQuickSort() {
let arr = [5, 6, 2, 1, 9, 8, 3, 7, 4]
quickSort(arr, 0, arr.length-1)
console.log(arr) //[1, 2, 3, 4, 5, 6, 7, 8, 9]
}
testQuickSort()
总结:
以上就是JavaScript实现快速排序算法的最简单方法。快速排序虽然时间复杂度并不是最优的,但是在实际应用中有很好的性能表现。掌握快速排序算法的实现,有助于提高算法和编程能力。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论