【1101】Quick Sort (25 分)

简介: 2.思路利用继承关系求出每个元素A[i]的左边的最大值和右边的最小值(注意:要使得A[i]的左边的左右元素都比A[i]要小,所以要找A[i]左边的最大值进行比较)。

1.题目

https://pintia.cn/problem-sets/994805342720868352/problems/994805377432928256

基于快排背景,其实就是找主元。

2.思路

利用继承关系求出每个元素A[i]的左边的最大值和右边的最小值(注意:要使得A[i]的左边的左右元素都比A[i]要小,所以要找A[i]左边的最大值进行比较)。

(1)A[0]~A[i-2]的最大值即leftMax[i-1],而A[0]~A[i-1]的最大值即leftMax[i],for循环内的判断如下:

if(A[i-1]>leftMax[i-1])
    leftMax[i]=A[i-1];
else if(A[i-1]<leftMax[i-1])
    leftMax[i]=leftMax[i-1];//直接继承上个元素记录的max

(2)同理也可以用rightMin数组记录序列A的每一位的最小位(不含本位),即rightMin[i]表示A[i+1]~A[n-1]的最小值(初值rightMin=INF,从右到左遍历),和上面方法一样for遍历一次。

(3)最后一次for遍历A序列进行判断,如果leftMax[i]小于A[i],且rightMin[i]大于A[i],则可以判断A[i]是主元,并记录到ans[i]数组中最后输出即可。


3.代码

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>  
using namespace std;  
const int MAXN=100010;
const int INF=0x3fffffff;  //一个很大的数
//a为序列,leftMax和rightMin分别为每一位左边最大的数和右边最小的数
int a[MAXN],  leftMax[MAXN]  ,rightMin[MAXN];
//ans记录所有主元,num为主元个数
int ans[MAXN],num=0;
int main(){   
  int n;
  scanf("%d",&n);
  for(int i=0;i<n;i++){
    scanf("%d",&a[i]);  //输入序列元素
  }
  leftMax[0]=0;   //A[0]左边没有比它大的数
  for(int i=1;i<n;i++){
    leftMax[i]=max(    leftMax[i-1]   ,   a[i-1]  ); //由i-1推得i
    //注意加头文件algorithm后才能直接用max或min
  }
  rightMin[n-1]=INF;  //A[n-1]右边没有比它小的数
  for(int i=n-2;i>=0;i--){
    rightMin[i]=min( rightMin[i+1]   ,  a[i+1] );//由i-1推得i
  }
  for(int i=0;i<n;i++){
    //左边所有数比它小,右边所有数比它大
    if( leftMax[i]<a[i]   &&  rightMin[i]>a[i]){
      ans[num++]=a[i];  //记录主元
    }
  }
  printf("%d\n",num);  //输出主元个数
  for(int i=0; i<num; i++){
    printf("%d",ans[i]);  //依次输出所有主元
    if(i<num-1)  printf(" ");
  }
  printf("\n");  //必须有换行
  system("pause");
    return 0;   
}

4.注意点

(1)暴力判断会超时。

(2)当主元为0个时,第二行虽然没输出主元,但也要输出一个换行。

相关文章
|
6月前
3秒的你对战“它”有没有胜算——quicksort
3秒的你对战“它”有没有胜算——quicksort
41 0
|
搜索推荐
排序算法:QuickSort
排序算法:QuickSort
|
3月前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
34 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
6月前
|
搜索推荐 算法
Quick Sort
Quick Sort “【5月更文挑战第18天】”
45 7
|
算法 编译器 C语言
qsort函数 - (Quick Sort)【快速排序的使用方法】
qsort函数 - (Quick Sort)【快速排序的使用方法】
|
存储 搜索推荐
十大排序之Quick Sort 快速排序
十大排序之Quick Sort 快速排序
|
搜索推荐 C语言
快排函数 -- qsort函数(Quick Sort)
快排函数 -- qsort函数(Quick Sort)
125 0
|
机器学习/深度学习 搜索推荐 算法
图解快排——快速排序算法(quick sort)
图解快排——快速排序算法(quick sort)
220 0
图解快排——快速排序算法(quick sort)
|
算法 Java
经典算法之快速排序(QuickSort)
经典算法之快速排序(QuickSort)
197 0
经典算法之快速排序(QuickSort)
|
搜索推荐 C语言
Quicksort快速排序
快速排序思想
82 0
Quicksort快速排序