標籤:演算法 沒有 交換 pre void lib 多少 color ++
著名的快速排序演算法裡有一個經典的劃分過程:我們通常採用某種方法取一個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。 給定劃分後的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
- 主元前面的數小於該主元,後面的數大於該主元,所以排序後主元應該還在相應的位置。
-
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<ctype.h> 5 #include<math.h> 6 int cmp(const void *a,const void *b){ 7 return *(int*)a -*(int*)b; 8 } 9 int main(){10 int n;11 scanf("%d",&n);12 long a[100010]; 13 long b[100010];14 long c[100010];15 int k = 0;16 int i,j;17 int flag = 0;18 for(i=0;i<n;i++){19 scanf("%ld",&a[i]);20 c[i] = a[i];21 }22 qsort(c,n,sizeof(c[0]),cmp);23 24 int max = 0;25 for(i=0;i<n;i++){26 if(max<a[i])27 max = a[i];28 if(a[i]==c[i]&&max==c[i])29 b[k++] = c[i];30 }31 printf("%d\n",k);32 for(i=0;i<k;i++){33 if(i==0)34 printf("%ld",b[i]);35 else36 printf(" %ld",b[i]);37 }38 if(k==0)39 printf("\n");40 }
PAT 1045. 快速排序(25)