首页 > 试题广场 >

设一组初始记录关键字序列(5,2,6,3,8),以第一个记录

[单选题]
设一组初始记录关键字序列(5,2,6,3,8),以第一个记录关键字5为基准进行一趟快速排序的结果为()
  • 2,3,5,8,6
  • 3,2,5,8,6
  • 3,2,5,6,8
  • 2,3,6,5,8
推荐
答案:选C
根据快排思想,选5为基准,
8比5大,不变;
3比5小,交换放到第一位;
2比5小,不变;
6比5大,放到第4个位置;
最后把5当到第3个位置
编辑于 2015-02-02 11:04:57 回复(0)
_ 2 6 3 8
3 2 6 _ 8
3 2 _ 6 8

32(5)68
发表于 2015-08-31 16:41:16 回复(0)
https://zh.m.wikipedia.org/wiki/快速排序 根据维基百科上快速排序, 分治法:52638中比5小的序列为23,比5大的序列为68,23+5+68=23568 原地分区版本:52638-将5放到最后-82635-2小于5,交换2与8-28635-3小于5,交换3与8,23685-将5交换到最后的位置-23586 求纠正......
发表于 2016-03-21 09:40:33 回复(0)
这题选  C   3 2 5 6 8
以5为基准,5 2 6 3 8,从两端开始扫描
规则是:
1.从右边扫描时,记录比基准小的元素的下标j
2.从左边扫描时,记录比基准大的元素的下标i
3.  if(若此时两个下标 i = j){
        当前下标的元素与基准进行交换,结束一次划分
        把原有序列分为两端重新划分
    }
    else{
        执行第四步骤
    }
4.这时开始交换两个下标对应的元素
5.以当前的位置开始,继续从1开始
第一次交换6和3    5 2 3 6 8
第二次交换5和3    3 2 5 6 8
第一次划分完成    这题选  C
发表于 2015-01-22 19:30:48 回复(3)
快排是选择一个基准,从后往前一次比较,遇到小的交换位置
发表于 2016-05-12 23:27:55 回复(0)
快速排序根据不同的Partition数组得到的结果应该也不同
编辑于 2015-08-15 14:49:36 回复(0)
啥头像
要看快速排序的具体实现方法。

3  2  5  6  8  可以

2  3  5  6  8 也可以
发表于 2015-07-25 14:11:25 回复(0)
答案:C
发表于 2015-03-31 22:52:07 回复(0)
发表于 2017-06-20 08:49:58 回复(0)
这难道不取决于快速排序的实现方法,是先从左向右还是先先右后左呢?
发表于 2015-09-04 10:07:42 回复(0)
不太明白为什么快排就只有这一种写法?算法导论里的快排不会是这个结果
发表于 2019-05-18 18:14:40 回复(0)

快排的核心思想就是选取基准(哨兵)元素,通常选第一个。然后通过一趟排序将待排序的记录分割成独立的俩部分,其中一部分记录元素值均比基准元素值小,另一部分记录元素的值均大于基准元素值,此时基准元素在其排好序后的正确位置。

private static void quickSort(int[] unsorted, int left, int right) {
        if (left < right) {
            int pivot_pos = partition(unsorted, left, right);
            quickSort(unsorted, left, pivot_pos - 1);
            quickSort(unsorted, pivot_pos + 1, right);
        }
    }

    /*
     * partition方法用来把数组分开,返回已排序的那个主元的位置。然后对左边和右边分别进行快速排序。
     */
    private static int partition(int[] a, int low, int high) {
        int pivot = a[low];
        while (low < high) {
            while (low < high && a[high] >= pivot)
                high--;
            a[low] = a[high];//将小于主元的放在前面
            while (low < high && a[low] <= pivot)
                low++;
            a[high] = a[low];//将大于主元的放在后面
        }
        a[low] = pivot;// 将主元放在正确的位置
        return low;// 根据该位置分为前后两部分分别进行快排
    }
编辑于 2018-06-05 14:55:15 回复(0)
进行一趟排序............
发表于 2016-08-04 20:04:16 回复(0)
我是按照算法导论上的快排算法答这种题一次都没对过
发表于 2015-10-09 09:08:20 回复(2)
    

发表于 2015-10-05 09:31:30 回复(0)
int lo = 0,mid = lo;
int pivot = arr[lo];
for (int k = lo + 1; k < len; k++){
    if (arr[k] < pivot)
        swap(arr[++mid], arr[k]);
}
swap(arr[mid], arr[lo]);

发表于 2015-09-26 21:37:32 回复(0)
答案:C
快排是先取出第一个数作为基数,两个指针,一个指向第二个元素,一个指向最后一个元素
先操作后一个指针,如果这个数字比基数5小,就用这个数来填充第一个空位,否则就向前移动指针
后一个指针做交换操作之后再比较 前一个指针与基数5的大小,比较与移动方向相反,最后将基数5放回两个指针共同指向的空位
发表于 2015-01-17 19:23:56 回复(1)