1045. 快速排序

来源:互联网 发布:淘宝助理违规验证通过 编辑:程序博客网 时间:2024/05/22 06:52

1045. 快速排序(25)

时间限制
200 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CAO, Peng

著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的N个互不相同的正整数的排列,请问有多少个元素可能是划分前选取的主元?

例如给定N = 5, 排列是1、3、2、4、5。则:

  • 1的左边没有元素,右边的元素都比它大,所以它可能是主元;
  • 尽管3的左边元素都比它小,但是它右边的2它小,所以它不能是主元;
  • 尽管2的右边元素都比它大,但其左边的3比它大,所以它不能是主元;
  • 类似原因,4和5都可能是主元。

    因此,有3个元素可能是主元。

    输入格式:

    输入在第1行中给出一个正整数N(<= 105); 第2行是空格分隔的N个不同的正整数,每个数不超过109

    输出格式:

    在第1行中输出有可能是主元的元素个数;在第2行中按递增顺序输出这些元素,其间以1个空格分隔,行末不得有多余空格。

    输入样例:
    51 3 2 4 5
    输出样例:
    31 4 5
    #include<stdio.h>#include<stdlib.h>int compare(const void *a,const void *b){  return *((int *)a)-*((int *)b);}int main(){  int num[100000],temp[100000],result[100000],*p_result=result,i,j,n;  scanf("%d",&n);  for(i=0;i<n;i++)  {    scanf("%d",num+i);    temp[i]=num[i];  }  qsort(temp,n,sizeof(int),compare);  for(i=0;i<n;i++)  {    if(temp[i]==num[i])    {      *(p_result++)=i;    }  }  for(i=0,j=0;i<n&&j<p_result-result;i++)  {    if(i<result[j]&&num[i]<num[result[j]])      ;    else if(i>=result[j])      j++;    else if(num[i]>num[result[j]])    {      while(num[i]>num[result[j]]&&j<p_result-result)      {        result[j]=-1;        j++;      }    }  }  for(i=0,n=0;i<p_result-result;i++)  {    if(result[i]>=0)    {      temp[n++]=num[result[i]];    }  }  printf("%d\n",n);  if(n==0)  {    printf("\n");    return 0;  }  for(i=0;i<n-1;i++)    printf("%d ",temp[i]);  printf("%d\n",temp[i]);  return 0;}
  • #include <stdio.h>                                     //第二个测试点超时 无奈了int cmp(const void *a, const void *b){  return *(int *)a - *(int *)b;}int main(){  int i, j, k = 0, flag, N, flag1 = 0;  int Num, Max = 0;  int arr1[100000], arr2[100000];  scanf("%d", &N);  for (i = 0; i < N; i++)    scanf("%d", &arr1[i]);  for (i = 0; i < N; i++)  {    Num = arr1[i];    if (Num > Max)    {      Max = Num;      for (j = i + 1; j < N; j++)      {        if (Max < arr1[j])          Max = arr1[j];        if (arr1[j] <= Num||flag1==1)        {          i = j; flag1 = 1;          if (Max > arr1[j])            break;        }      }      if (flag1 != 1)      {        arr2[k] = Num;        k++;        Max = 0;        flag1 = 0;      }      flag1 = 0;    }  }  if (k == 0)  {    printf("0\n\n"); return 0;  }  printf("%d\n", k);  qsort(arr2, k, sizeof(arr2[0]), cmp);  for (i = 0; i < k; i++)  {    if (i == 0)      printf("%d", arr2[i]);    else      printf(" %d", arr2[i]);  }}

  • 0 0