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;
}
相关文章
|
18天前
|
存储 安全 C++
C++中的引用和指针:区别与应用
引用和指针在C++中都有其独特的优势和应用场景。引用更适合简洁、安全的代码,而指针提供了更大的灵活性和动态内存管理的能力。在实际编程中,根据需求选择适当的类型,能够编写出高效、可维护的代码。理解并正确使用这两种类型,是掌握C++编程的关键一步。
21 1
|
18天前
|
数据采集 存储 编译器
this指针如何使C++成员指针可调用
本文介绍了C++中的this指针,它是一个隐藏的指针,用于在成员函数中访问对象实例的成员。文章通过代码示例阐述了this指针的工作原理,以及如何使用指向成员变量和成员函数的指针。此外,还提供了一个多线程爬虫示例,展示this指针如何使成员指针在对象实例上调用,同时利用代理IP和多线程提升爬取效率。
this指针如何使C++成员指针可调用
|
4天前
|
存储 安全 编译器
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
32 5
|
3天前
|
C++ 容器
【编程技巧】 C++11智能指针
C++11引入了智能指针以自动管理内存,防止内存泄漏和悬挂指针: - `shared_ptr`:引用计数,多所有权,适用于多个对象共享资源。 - `unique_ptr`:独占所有权,更轻量级,适用于单一对象所有者。 - `weak_ptr`:弱引用,不增加引用计数,解决`shared_ptr`循环引用问题。 ## shared_ptr - 支持引用计数,所有者共同负责资源释放。 - 创建方式:空指针、new操作、拷贝构造/移动构造,以及自定义删除器。 - 提供`operator*`和`operator-&gt;`,以及`reset`、`swap`等方法。 ## unique_ptr
|
6天前
|
Java
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
15 3
|
6天前
|
存储 Java C#
C++语言模板类对原生指针的封装与模拟
C++|智能指针的智能性和指针性:模板类对原生指针的封装与模拟
|
4天前
|
C++
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
7 0
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
|
6天前
|
设计模式 C++ 开发者
C++一分钟之-智能指针:unique_ptr与shared_ptr
【6月更文挑战第24天】C++智能指针`unique_ptr`和`shared_ptr`管理内存,防止泄漏。`unique_ptr`独占资源,离开作用域自动释放;`shared_ptr`通过引用计数共享所有权,最后一个副本销毁时释放资源。常见问题包括`unique_ptr`复制、`shared_ptr`循环引用和裸指针转换。避免这些问题需使用移动语义、`weak_ptr`和明智转换裸指针。示例展示了如何使用它们管理资源。正确使用能提升代码安全性和效率。
14 2
|
11天前
|
存储 算法 安全
C++一分钟之-数组与指针基础
【6月更文挑战第19天】在C++中,数组和指针是核心概念,数组是连续内存存储相同类型的数据,而指针是存储内存地址的变量。数组名等同于指向其首元素的常量指针。常见问题包括数组越界、尝试改变固定大小数组、不正确的指针算术以及忘记释放动态内存。使用动态分配和智能指针可避免这些问题。示例代码展示了安全访问和管理内存的方法,强调了实践的重要性。
26 3
|
15天前
|
编译器 Linux C++
C++智能指针
**C++智能指针是RAII技术的体现,用于自动管理动态内存,防止内存泄漏。主要有三种类型:已废弃的std::auto_ptr、不可复制的std::unique_ptr和可共享的std::shared_ptr。std::unique_ptr通过禁止拷贝和赋值确保唯一所有权,而std::shared_ptr使用引用计数来协调多个指针对同一资源的共享。在C++17中,std::auto_ptr因设计缺陷被移除。**