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 快排问题快速排序的主要内容,如果未能解决你的问题,请参考以下文章