首页 > 编程知识 正文

冒泡排序图解过程,快速排序动态图解

时间:2023-05-04 14:27:56 阅读:21450 作者:2358

“快速排序”(Quicksort )是泡沫排序的改进。 其基本思想是,将排序后的数据用一次排序分割成独立的两个部分,其中一个部分的所有数据小于其他部分的所有数据,然后用该方法分别高速地对两个部分的数据进行排序,从而递归地对整个排序过程进行排序在该算法中,将要排序的数组设为A[0]……A[N-1]、首先选择任意数据作为关键数据、然后将所有小于该关键数据的数置于左侧、将所有大于该关键数据的数置于右侧的过程称为快速排序。 值得注意的是,快速排序不是稳定的排序算法。 这意味着多个相同值的相对位置在算法结束时可能会发生变动。一趟快速排序的算法是:

设置两个变量I,j,排序开始时: i=0,j=N-1; 以第一个数组元素为关键数据,key=A[0]; 从j向前搜索,即从后向前搜索(j),找到小于第一个key的值A[j],交换A[j]和A[i]的值; 从I开始向后搜索,即从前到后搜索(I ),找到大于第一个key的A[i],交换A[i]和A[j]的值; 重复步骤3、4直到i=j; (在3,4个步骤中,没有找到符合条件的值。 即,在3中A[j]为key以上,在4中A[i]为key以下的情况下,以成为j=j-1,i=i 1的方式改变j,I的值。 找到符合条件的值进行交换时,I、j指针的位置不变。 另外,i==j的过程一定是I或j-完成时,在该时刻结束循环)。 排序演示假设用户输入了以下数组:

此时,创建变量i=0(指第一个数据的下标(,j=5),指最后一个数据的下标),k=6(代入第一个数据的值)。

所有小于k的数都向k的左边移动,所以开始寻找小于6的数。 从j开始,从右向左搜索,逐渐减少变量j的值。 我发现第一个下标3的数据小于6。 然后,将数据3移动到下标0的位置,将下标0的数据6移动到下标3,完成第一次比较:

此时i=0 j=3 k=6

然后,开始第二次的比较,这次要找比k大的东西。 然后,走了再找。 递增变量I时,发现下标2的数据首先大于k,用下标2的数据7和j指向的下标3的数据6进行交换,数据状态如下表所示:

此时i=2 j=2 k=6

上面的两次比较为一个循环

然后,进一步减小变量j,反复进行上述循环比较。

在本例中,如果循环一次,其中I和j指向下标2,则显示为“等待”。 于是,第一次比较结束。 结果如下,所有k(=6)的左边数都小于它,所有k的右边数都大于它。

I和j不见面的话,拿出I找大的,还没有的话,减少j找小的。 重复这个,重复循环。 判断和搜索同时进行。

然后,将k两侧的数据进一步分组,分别进行上述过程,直到不能再分组为止。

注:第一次快速排序不会直接生成最终结果,只有大于和小于k的数分为k两侧。 为了获得最后的结果,必须再次对下标2两侧的数组执行此步骤,并分解数组(只有一个数据),直到数组不能再分解。

到此为止,6左右为快速排序算法效率与稳定性分析

如果基础值不能成功拆分数组,也就是说,如果基础值将数组分为一个子数组,并且另一个子组中有n -1个记录,则下一个子数组将比原始数组小1。 这是高速排序的最坏情况。 每次分割发生时,快速排序都会退化为冒泡排序,其时间复杂度为o(n2 )。

如果标准值表明数组均匀地分为两个部分,则快速排序是最佳选择。 在这种情况下,必须按大小约为n/2的两个子数组进行排序。 用大小为n的记录确定记录位置所需的时间为o(n )。 如果t(n )是对n个记录进行排序所需的时间,则当一个记录得到正确的位置并且整个组大致分为两个相等部分时,得到快速排序算法的最佳时间复杂性。

快速排序是一种不稳定的排序算法,因为在进行交换时,只需根据比较基础值判断是否进行交换,而不是交换相邻元素,在交换过程中相同元素的顺序可能会发生变化。

代码实现publicstaticvoidmain (字符串[ ] args ) /任意数组int [ ] array={ 4、8、8、9、7、27、15、56、5 }; 快速排序(array,0,array.length-1 ); for(intI=0; iarray.length; I ) system.out.print(Array[I] ' ); } publicstaticvoidquicksort (int [ ] array,int start,int end ) { int low=start; int high=end; int key=array[low]; while(lowhigh ) ) while lowhigharray [ high ]=key ) high--; //end节点的值大于基准值时,小于基准值的值if [ low high ] { array [ low ]=array [ high ]; 行; }while(lowhigharray[low]=key ) low; if (低高度) { array[high]=array[low]; 高- -; } } array[low]=key; //此时start和end已经指向同一元素if(low-1start ) quicksort ) Array、start、low-1 ); if(high1end )快速排序(array,high 1,end ); }

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