失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 十大经典排序算法-快速排序算法详解

十大经典排序算法-快速排序算法详解

时间:2024-09-05 07:15:21

相关推荐

十大经典排序算法-快速排序算法详解

十大经典排序算法
十大经典排序算法-冒泡排序算法详解十大经典排序算法-选择排序算法详解十大经典排序算法-插入排序算法详解十大经典排序算法-希尔排序算法详解十大经典排序算法-快速排序算法详解十大经典排序算法-归并排序算法详解十大经典排序算法-堆排序算法详解十大经典排序算法-计数排序算法详解十大经典排序算法-桶排序算法详解十大经典排序算法-基数排序算法详解

一、什么是快速排序

1.概念

快速排序(Quick Sort)是从冒泡排序算法演变而来的,实际上是在冒泡排序基础上的递归分治法。快速排序在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成了两个部分

2.算法原理

这是一个无序数列:4、5、8、1、7、2、6、3,我们要将它按从小到大排序。按照快速排序的思想,我们先选择一个基准元素,进行排序

我们选取4为我们的基准元素,并设置基准元素的位置为index,设置两个指针left和right,分别指向最左和最右两个元素

接着,从right指针开始,把指针所指向的元素和基准元素做比较,如果比基准元素大,则right指针向左移动,如果比基准元素小,则把right所指向的元素填入index中

3和4比较,3比4小,将3填入index中,原来3的位置成为了新的index,同时left右移一位

然后,我们切换left指针进行比较,如果left指向的元素小于基准元素,则left指针向右移动,如果元素大于基准元素,则把left指向的元素填入index中

5和4比较,5比4大,将5填入index中,原来5的位置成为了新的index,同时right左移一位

接下来,我们再切换到right指针进行比较,6和4比较,6比4大,right指针左移一位

2和4比较,2比4小,将2填入index中,原来2的位置成为新的index,left右移一位

随着left右移,right左移,最终left和right重合

此时,我们将基准元素填入index中,这时,基准元素左边的都比基准元素小,右边的都比基准元素大,这一轮交换结束

第一轮,基准元素4将序列分成了两部分,左边小于4,右边大于4,第二轮则是对拆分后的两部分进行比较

此时,我们有两个序列需要比较,分别是3、2、1和7、8、6、5,重新选择左边序列的基准元素为3,右边序列的基准元素为7

第二轮排序结束后,结果如下所示

此时,3、4、7为前两轮的基准元素,是有序的,7的右边只有8一个元素也是有序的,因此,第三轮,我们只需要对1、2和5、6这两个序列进行排序

第三轮排序结果如下所示

至此所有的元素都是有序的

3.算法实现

function sort(arr, startIndex, endIndex) {// 递归结束条件:startIndex大于等于endIndex的时候if (startIndex >= endIndex) {return;}// 得到基准元素的位置let pivotIndex = partition(arr, startIndex, endIndex);sort(arr, startIndex, pivotIndex - 1);sort(arr, pivotIndex + 1, endIndex);}function partition(arr, startIndex, endIndex) {// 选择第一个位置的元素作为基准元素let pivot = arr[startIndex];let left = startIndex;let right = endIndex;let index = startIndex;// 外循环在左右指针重合或者交错的时候结束while (right > left) {// right指针从右向左进行比较while (right > left) {if (arr[right] < pivot) {arr[left] = arr[right];index = right;left++;break;}right--;}// left指针从左向右进行比较while (right > left) {if (arr[left] > pivot) {arr[right] = arr[left];index = left;right--;break;}left++;}}arr[index] = pivot;return index;}let arr = [4, 5, 8, 1, 7, 2, 6, 3];sort(arr, 0, arr.length - 1);console.log(arr);

三、快速排序算法特点

1.时间复杂度

快速排序算法在分治法的思想下,原数列在每一轮被拆分成两部分,每一部分在下一轮又分别被拆分成两部分,直到不可再分为止,平均情况下需要logn轮,因此快速排序算法的平均时间复杂度是O(nlogn)

在极端情况下,快速排序算法每一轮只确定基准元素的位置,时间复杂度为O(N^2)

2.空间复杂度

快速排序算法排序过程中只是使用数组原本的空间进行排序,因此空间复杂度为O(1)

3.稳定性

快速排序算法在排序过程中,可能使相同元素的前后顺序发生改变,所以快速排序是一种不稳定排序算法

另外推荐一个开发者小工具网站,个人觉得里面的Json格式化功能很强大,报错很详细

/

还可以输入表达式进行内容选取,对于复杂json非常多层级的内容展现非常用用处

如果觉得《十大经典排序算法-快速排序算法详解》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。