首页 > 试题广场 >

有一组数据{46,79,56,38,40,84}利用快速排序

[单选题]
有一组数据{46,79,56,38,40,84}利用快速排序,以第一个元素为基准得到的一次划分结果为:
  • {38,40,46,56,79,84}
  • {40,38,46,79,56,84}
  • {40,38,46,56,79,84}
  • {40,38,46,84,56,79}
快速排序是不是有两种方式呀,我用这种方式选a
发表于 2020-02-16 11:11:46 回复(2)
这题目不严谨啊,若lo,hi都从1开始往后则选B;若lo从前往后,hi从后往前则选C;
发表于 2019-05-16 00:36:04 回复(0)
                                                 lo     hi  小于不变,大于交换
第一次:46 79 56 38 40 84 (46 < 84,不变)
第二次:40 79 56 38 46 84 (46 > 40,交换)
第三次:40 46 56 38 79 84 (79 > 46,交换)
第四次:40 38 56 46 79 84 (46 > 38,交换)
第五次:40 38 46 56 79 84 (56 > 46,交换)
结束
发表于 2019-05-16 11:33:06 回复(0)
快速排序,找到两个指针 l 和 r,这两个指针分别初始化为:*l=46, *r=84。现在开始第一趟排序,选择第一个数 46 作为中枢数字,排序的步骤:
1. r 指针从右往左,找到比 46 小的数;找到的话,把这个数赋值给左指针;判断 l==r
2. l 指针从左往右,找到比 46 大的数;找到的话,把这个数赋值给右指针;判断 l==r
3. 如果 (l == r),则将 46 放在 l==r 的位置;否则,重复 1 和 2.

例子:
初始:46, 79, 56, 38, 40, 84,*l=46, *r=84;
第一趟:40, 79, 56, 38, 40, 84,*r=40, *l=40 (r 指针左移找到 40 < 46,赋值给左指针);
第二趟:40, 79, 56, 38, 79, 84,  *l=79, *r=79 (l 指针右移找到 79 > 40,赋值给右指针);
第三趟:40, 38, 56, 38, 79, 84, *r=38, *l=38(r 指针左移找到 38 < 46,赋值给左指针);
第四趟:40, 38, 56, 56, 79, 84, *l=56, *r=56(l 指针找到 56 > 46,赋值给右指针);
第五趟:40, 38, 46, 56, 79, 84, (l==r,两指针相遇,所在位置为中枢数字 46).

然后,利用分治的思想,对 46 左边子序列和右边子序列再分别分割。
平均复杂度 O(NlogN) ,最坏情况下 O(N2)
 
发表于 2022-04-27 23:27:40 回复(0)
选B吧

发表于 2021-07-15 10:48:59 回复(0)
双向分区法选A,单向分区法选B,百度百科的分区法选C。所以要怎么写
发表于 2020-07-29 18:19:57 回复(0)