LQ0169 快排问题快速排序

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0169 快排问题快速排序相关的知识,希望对你有一定的参考价值。

题目来源:蓝桥杯2016初赛 C++ A组D题

题目描述
本题为代码补全填空题,请将题目中给出的源代码补全,并复制到右侧代码框中,选择对应的编译语言(C/Java)后进行提交。若题目中给出的源代码语言不唯一,则只需选择其一进行补全提交即可。复制后需将源代码中填空部分的下划线删掉,填上你的答案。提交后若未能通过,除考虑填空部分出错外,还需注意是否因在复制后有改动非填空部分产生错误。

排序在各种场合经常被用到。 快速排序是十分常用的高效率的算法。

其思想是:先选一个“标尺”,用它把整个队列过一遍筛子,以保证:其左边的元素都不大于它,其右边的元素都不小于它。

这样,排序问题就被分割为两个子区间。 再分别对子区间排序就可以了。

下面的代码是一种实现,请分析并填写划线部分缺少的代码。

源代码
C

#include <stdio.h>

void swap(int a[], int i, int j)

    int t = a[i];
    a[i] = a[j];
    a[j] = t;


int partition(int a[], int p, int r)

    int i = p;
    int j = r + 1;
    int x = a[p];
    while(1)
        while(i<r && a[++i]<x);
        while(a[--j]>x);
        if(i>=j) break;
        swap(a,i,j);
    
    _____________________;
    return j;


void quicksort(int a[], int p, int r)

    if(p<r)
        int q = partition(a,p,r);
        quicksort(a,p,q-1);
        quicksort(a,q+1,r);
    

    
int main()

    int i;
    int a[] = 50,49,48,48,47,46,1,3,5,2,4,6,30,30,30,30;
    int N = 16;
    
    quicksort(a, 0, N-1);
    
    for(i=0; i<N; i++) printf("%d.", a[i]);
    printf("\\n");
    
    return 0;

问题分析
这是快速排序的实现。填入:“swap(a,p,j)”

AC的C语言程序如下:

#include <stdio.h>

void swap(int a[], int i, int j)

    int t = a[i];
    a[i] = a[j];
    a[j] = t;


int partition(int a[], int p, int r)

    int i = p;
    int j = r + 1;
    int x = a[p];
    while(1)
        while(i<r && a[++i]<x);
        while(a[--j]>x);
        if(i>=j) break;
        swap(a,i,j);
    
    swap(a,p,j);
    return j;


void quicksort(int a[], int p, int r)

    if(p<r)
        int q = partition(a,p,r);
        quicksort(a,p,q-1);
        quicksort(a,q+1,r);
    

    
int main()

    int i;
    int a[] = 50,49,48,48,47,46,1,3,5,2,4,6,30,30,30,30;
    int N = 16;
    
    quicksort(a, 0, N-1);
    
    for(i=0; i<N; i++) printf("%d.", a[i]);
    printf("\\n");
    
    return 0;

以上是关于LQ0169 快排问题快速排序的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯04

蓝桥杯07

算法 - 快速排序 - 经典快排 | 随机快排

快速排序(经典快排以及随机快排)

快速排序法之双路快排

40分钟掌握快速排序-三路快排算法