首页 > 编程知识 正文

简单选择排序图解,快速排序

时间:2023-05-03 13:38:54 阅读:21446 作者:609

前言排序算法非常多,大多数人最先学习的排序算法是泡沫算法,但泡沫算法的时间复杂度非常高,是效率低下的算法。 目前快速排序是一种比较好的算法。 实施难度低,时间复杂度低。 但是,在某些情况下,快速排序可能会退化到与冒泡算法相同的时间复杂性,需要读者注意。 以下进行说明。 现在让我们来看看这个算法。

笔者尚浅学,有不同观点欢迎评论区和私信讨论。 转载的情况请用信息通知我。

另外,请阅读笔者的个人博客修仙猴子的个人博客,更美丽的用户界面,更好的阅读体验。

算法的想法递归算法的想法其实很简单:

从数据中取出一个数。 也就是说,将mid小于mid的数放在左边,将大于mid的数放在右边,最后将mid放在中间,对左右两侧的子数组进行递归排序。 如果只剩下一个要素,则全部排序完成。 举一个具体的实现构想:

有数组:

这里细心的读者会注意到,呃,第三个数为什么后面有一点,这不是手滑打的。 为了证明在排序过程中,两个3的顺序是否会逆转,要得到这是否是稳定的排序。

首先,作为哨兵提取数量。 这里以最初的数5为哨兵。 然后和这个数交换最后的数。 为什么需要更换呢? 这样,就不需要添加存储哨兵的变量。 图:

然后,min和max们分别设置两个变量:表示小于mid的数量的最大下标和大于mid的数量最小的坐标。

举个例子如下图所示。

接下来从左边开始吧。 如果min指向的数量小于哨兵,则min=min 1,否则停止。 运行后如下图所示。

然后从右边开始,如果max指向哨兵以上,则max=max-1,否则停止,执行完成后如下图所示。

然后,交换min和max指向的数字。 ()这里可以看到两个3的顺序颠倒了,所以这是不稳定的排序。)

重复3、4、5个步骤直到min==max

下标为min的数字和哨兵交换,至此的回合排序完成:

递归排序前后子数组。 完成排序。

快速排序的核心是利用递归分割统治的思路降低时间的复杂性。 每次选择中值时,递归树的高度为logn (其中n表示元素的个数。 如果需要遍历递归的每一层数组,则时间复杂度最高的情况如下:

o(logn ) )。

但是,如果每次取最小或最大的数,则快速序列递归树的高度为n,其他时间复杂度退化如下。

o (n (2) ) ) )。

因为只需要常数空间,所以空间的复杂性如下。

o(1) )。

代码演示使用java语言创建规范。 接口参数是整数数组、数组的开始下标和数组的结束下标。 因为有可能是子数组,所以需要下标参数)

privatevoidfastsort(int[]nums,int start,int end )//退出条件: start=endif(start=end ) return; //记录原下标int startRow=start的int endRow=end; //通过随机数获取下标,可以降低退化到n^2的概率int random=new Random ().nextint(end-start ) start;//交换两个swap (编号、随机、结束); //上述3,4,5步while({ startend ) ) /这里的每一步start end while nums [ start ] nums [ endrow ] startend ) ) start; } while (nums [ end ]=nums [ endrow ] startend ) end----; (//如果相同,将哨兵放在中间,排序结束)//否则start和end调换位置,继续循环if ) start==end ) swap(nums,start,endRow ) else{swap(nums,start,end ); }//最后递归排序子数组的paixu(NUMS,startRow,start-1 ); Paixu(NUMS,start 1,endRow ); //数组中的两个专用vatevoidswap (int [ ] nums,int one,int two ) { int temp=nums[one]; nums[one]=nums[two]; nums[two]=temp; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。