2016年蓝桥杯c/c++ c组第5题 快速排序 双指针

简介: 2016年蓝桥杯c/c++ c组第5题 快速排序 双指针

题目:



快速排序


排序在各种场合经常被用到。

快速排序是十分常用的高效率的算法。


其思想是:先选一个“标尺”,

用它把整个队列过一遍筛子,

以保证:其左边的元素都不大于它,其右边的元素都不小于它。


这样,排序问题就被分割为两个子区间。

再分别对子区间排序就可以了。


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



#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[] = {5,13,6,24,2,8,19,27,6,12,1,17};
  int N = 12;
  quicksort(a, 0, N-1);
  for(i=0; i<N; i++) printf("%d ", a[i]);
  printf("\n");
  return 0;
}



注意:只填写缺少的内容,不要书写任何题面已有代码或说明性文字。



答案:


#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[] = {5,13,6,24,2,8,19,27,6,12,1,17};
  int N = 12;
  quicksort(a, 0, N-1);
  for(i=0; i<N; i++) printf("%d ", a[i]);
  printf("\n");
  return 0;
}



——————————————————————————————————————


用递归实现快速排序:


#include <iostream>
#include <cstdio>
using namespace std;
void quick_sort(int arr[],int left,int right)
{
  if(left>=right)
  return;
  int i,j,base,temp;
  i = left,j=right;    //i,j作为左右移标,left,right不动 
  base = arr[left];    //base作为基准值 
  while(i<j)          
  {
  while(arr[j]>=base&&i<j) j--;    //将j移到后面数比基准值小的数得下标 
  while(arr[i]<=base&&i<j) i++;    //将i移到前面比基准值大的数下标 
  if(i<j)
  {
    temp = arr[i];               //进行相互替换 
    arr[i] = arr[j];
    arr[j] = temp;
  }
  }
  arr[left] = arr[i];                 //首先把刚开始作为基准值的位置换上符合比基准值小的就是i的下标 
  arr[i] = base;                      //再将基准值给到i位置,作为分界线 
  quick_sort(arr,left,i-1);           //进行递归操作 
  quick_sort(arr,i+1,right);
}
int main()
{
  int arr[] = {5,4,9,10,2,1,5};
  int len = sizeof(arr)/sizeof(arr[0]);
  quick_sort(arr,0,len-1);
  for(int i=0;i<len;i++)
  printf("%d ",arr[i]);
  return 0;
}
相关文章
|
1月前
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
1月前
|
人工智能 算法 BI
第十四届蓝桥杯省赛大学C组(C/C++)三国游戏
第十四届蓝桥杯省赛大学C组(C/C++)三国游戏
|
1月前
|
人工智能 C++
第十四届蓝桥杯省赛大学B组(C/C++)整数删除
第十四届蓝桥杯省赛大学B组(C/C++)整数删除
|
10天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
33 4
|
26天前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
1月前
|
机器学习/深度学习 算法 关系型数据库
第十五届蓝桥杯C++B组省赛
第十五届蓝桥杯C++B组省赛
71 14
|
1月前
|
算法 C++
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
35 5
|
1月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
38 1
|
1月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
30 2
|
1月前
|
算法
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序