首页 > 软件 > 快速排序的基准数可以选择多个吗?

快速排序的基准数可以选择多个吗?

软件 2023-01-10

快速排序,看了解释还是不会,求通俗点的

快速排序简单的说就是选择一个基准,将比起大的数放在一边,小的数放到另一边。对这个数的两边再递归上述方法。

如本题

66 13 51 76 81 26 57 69 23,以66为基准,升序排序的话,比66小的放左边,比66大的放右边, 类似这种情况 13 。。。 66。。。69

具体快速排序的规则一般如下:

从右边开始查找比66小的数,找到的时候先等一下,再从左边开始找比66大的数,将这两个数借助66互换一下位置,继续这个过程直到两次查找过程碰头。

例子中:

66 13 51 76 81 26 57 69 23

从右边找到23比66小,互换

23 13 51 76 81 26 57 69 66

从左边找到76比66大,互换

23 13 51 66 81 26 57 69 76

继续从右边找到57比66小,互换

23 13 51 57 81 26 66 69 76

从左边查找,81比66大,互换

23 13 51 57 66 26 81 69 76

从右边开始查找26比66小,互换

23 13 51 57 26 66 81 69 76

从左边开始查找,发现已经跟右边查找碰头了,结束,第一堂排序结束

下面排序C语言的排序快速代码,参考一下

voidsort(int*a,intleft,intright)
{
if(left>=right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
{
return;
}
inti=left;
intj=right;
intkey=a[left];

while(i{
while(i/*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升
序还是降序)2,没有符合条件1的,并且i与j的大小没有反转*/
{
j--;/*向前寻找*/
}

a[i]=a[j];
/*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是
a[left],那么就是给key)*/

while(i=a[i])
/*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,
因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/
{
i++;
}

a[j]=a[i];
}

a[i]=key;/*当在当组内找完一遍以后就把中间数key回归*/
sort(a,left,i-1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/
sort(a,i+1,right);/*用同样的方式对分出来的右边的小组进行同上的做法*/
/*当然最后可能会出现很多分左右,直到每一组的i=j为止*/
}

快速排序的一个问题!

可以的,这是一段代码: void qsort( int shuju[],short int shangbiao,short int xiabiao) { short int i=shangbiao,j=xiabiao; /*i和j用来确定还需要判断排序的范围上下标*/ short int shu=i; /*记录基准点*/ long int zhongjie; if(shangbiaoshu;j--) /*对基准数右边扫描*/ { if(shuju[j]

C语言,快速排序算法

你好!
首先0,n-1。应该是数组的坐标(因为n个数字。所以数组的坐标是0到n-1)
而a是你传入的数组。所以他会根据数组的坐标到数组中找到元素。比较并进行排序。
递归这段理解如下:
首先要了解快速排序的思想:
1)随意找一个基准数。将比基准小的都放到它左边。比它大的都放到它右边。所以当返回基准的坐标的时候。其实这个坐标左边都是小于它的,右边都是大于等于它的。(这里主要是看代码的实现。图中代码是大于等于在右边。也可以自己写小于等于在左边。这个不影响最后结果)
2)那么第二次对于返回基准坐标的左右两边。我们同样利用返回的基准坐标找到两个“基准”(如下图)。就会使得返回的这两个基准左右两边有序
第三次用返回的两个基准找到四个基准(如图)
然后不断递归..不断的在整体有序的情况下使局部变的有序。
假设为532348789
第一次以a【0】5为基准。
则:


图中红色标识为基准元素最后会使得数组全局有序。
希望能对你有所帮助。

快速排序基准数选好以后,左边比他小的数是按原来在数组中的顺序排列吗?

不一定的。快速排序是一种“不稳定”的排序。 快速排序基准数选好以后,左边比他小的数不一定是按原来在数组中的顺序排列的。

快速排序中 基准值选取数组第一个数为什么只能写x=a[left]而不能写a[0]?

你没有理解快速排序的本质。 快速排序有2个要点:1.选中心点 2.递归。 中心点一般选择区间第一个值。 在第一次执行时,就是arr[0]。 执行完成后,只是实现了: 在中心点左侧值小于它,右侧值大于它。 之后以中心点为界限划分原数组为两部分递归执行。 所以中心点的选取是依赖于区间的,不能限定死。

标签:快速排序 编程 信息技术 算法 学习

大明白知识网 Copyright © 2020-2022 www.wangpan131.com. Some Rights Reserved. 京ICP备11019930号-18