SH12. 第二大的数
描述
输入n个整数,查找数组中第二大的数输入描述
第一行n表示n个数,第二行n个空格隔开的数输出描述
输出第二大的数示例1
输入:
5 1 2 3 4 5
输出:
4
C 解法, 执行用时: 2ms, 内存消耗: 200KB, 提交时间: 2021-09-10
#include <stdio.h> //index要调整的结点 n是总共结点数 void reHeap(int arr[],int index,int n){ int child = 2*index+1; int key = arr[index];//需要调整的结点的元素 while(child<n){//叶子结点存在 if(child+1<n && arr[child] < arr[child+1]){//右孩子存在且比左孩子大 ++child; } //child记录孩子中更大的那个结点下标 if(key<arr[child]){ arr[index] = arr[child];//把孩子的元素放在父结点处 index = child; child = 2*index+1; }else{ break; } } arr[index] = key; } //时间复杂度是O(nlogn) 空间复杂度O(1) 不稳定 void heapSort(int arr[],int n){ //把完全二叉树调整成大根堆 int i; for(i=n/2;i>=0;--i)//第一个非叶子结点 n/2 从下往上调整 reHeap(arr,i,n); for(i=0;i<n-1;i++){//循环进行n-1次 //arr[0]和arr[n-1-i]最后一个元素交换 int tmp = arr[0]; arr[0] = arr[n-1-i]; arr[n-1-i] = tmp; //不考虑最后一个元素的基础上,重新调整成大根堆 只需要调整0结点 reHeap(arr,0,n-1-i); } } int main() { int n; while(scanf("%d",&n)!=EOF) { int arr[n]; int index=0; while(index<n) { if(scanf("%d",&arr[index++])==EOF) break; } heapSort(arr,index); printf("%d\n",arr[index-2]); } return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 256KB, 提交时间: 2020-11-30
#include<stdio.h> #include<stdlib.h> int main() { int a[1000]; int i,j,n,temp; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } for(i=0;i<n-1;i++) { for(j=0;j<n-i-1;j++) { if(a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } printf("%d",a[n-2]); return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 256KB, 提交时间: 2019-03-23
#include<stdio.h> #include<stdlib.h> int main(){ int n,i,j,*a,temp; scanf("%d",&n); a=(int *)malloc(sizeof(int)*n); for(i=0;i<n;i++){ scanf("%d",&a[i]); } for(i=0;i<n;i++) for(j=i;j<n;j++) if(a[j]>a[i]) { temp=a[j]; a[j]=a[i]; a[i]=temp; } for(i=1;i<n;i++){ if(a[i]<a[0]){ printf("%d",a[i]); break; } if(i==9) printf("%d",a[i]); } return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 312KB, 提交时间: 2022-03-05
#include<stdio.h> #include<stdlib.h> int main() { int i,j,k,num,*p,temp; scanf("%d",&num); p=(int*)malloc(sizeof(int)*num); for(i=0;i<num;i++) scanf("%d",&p[i]); for(i=0;i<num-1;i++) { k=i; for(j=i+1;j<num;j++) { if(p[k]<p[j]) k=j; } if(k!=i) { temp=p[k]; p[k]=p[i]; p[i]=temp; } } printf("%d",p[1]); return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 348KB, 提交时间: 2022-04-21
/* #include <stdio.h> int find_sec_max(int arr[],int n) { int max1,max2; max1 = arr[0]; max2 = 0; int i,x; for(i = 0;i < n;i ++) { if(arr[i] >= max1) { max1 = arr[i]; } } for(i = 0,x = 0;i < n;i ++) { if(arr[i] >= max2 && arr[i] < max1) { max2 = arr[i]; x ++; } } if(x == 0) { max2 = max1; } return max2; } int main() { int data[100]; int n = 0; int i = 0; scanf("%d",&n); while( scanf("%d",&data[i++]) != EOF) {} printf("%d\n",find_sec_max(data, n)); return 0; } */ #include <stdio.h> int n,x,max,max2; int main() { int i=0; scanf("%d",&n); while(scanf("%d",&x)!=EOF) if(x>max) { max2 = max; max = x; } else if(x>max2) max2 = x; printf("%d\n",max2); return 0; }