基础实验7-2.2 插入排序还是堆排序 (25分)
解题思路:
1、插入排序的特点:从左往右扫描,前段数据非递减,当出现第一个递减的位置,再和原数据比较,此后若数据位置不变,则为插入排序。
2、堆排序的特点:从第2个位置起,一直找到第一个比首位数据大的数据止。
#include <stdio.h> #include <string.h> int Judge(int a[],int b[],int n) {//判断是插入排序还是堆排序 int i,pos=0,flag=0; for(i=2; i<=n; i++) { if(b[i-1]<b[i]) { flag=1; } if(b[i-1]>b[i]) { pos=i; break; } } if(flag) { for(i=pos; i<=n; i++) { if(b[i]!=a[i]) { pos=0; break; } } } else pos=0; return pos; } void NextInsertionSort(int a[],int pos,int n) {//下一趟插入排序 int i,index; int tmp=a[pos]; for(i=1; i<pos; i++) { if(a[i]>a[pos]) { index=i; break; } } for(i=pos-1; i>=index; i--) { a[i+1]=a[i]; } a[index]=tmp; } void AdjustDown(int a[],int k,int n) {//自顶向下调整成大顶堆 int i; a[0]=a[k]; for(i=k*2; i<=n; i*=2) { if(i<n&&a[i]<a[i+1]) i++; if(a[0]>=a[i])break; else { a[k]=a[i]; k=i; } } a[k]=a[0]; } void NextHeapSort(int a[],int n) {//下一趟堆排序 int i,index; for(i=2; i<=n; i++) { if(a[i]>a[1]) { index=i-1; break; } } int tmp; tmp=a[1]; a[1]=a[index]; a[index]=tmp; AdjustDown(a,1,index-1); } int main() { int n; scanf("%d",&n); int i; int a[n+1],b[n+1]; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for(i=1; i<=n; i++) { scanf("%d",&a[i]); } for(i=1; i<=n; i++) { scanf("%d",&b[i]); } int pos=Judge(a,b,n); if(pos) { printf("Insertion Sort\n"); NextInsertionSort(b,pos,n); } else { printf("Heap Sort\n"); NextHeapSort(b,n); } for(i=1; i<=n; i++) { if(i!=1) printf(" "); printf("%d",b[i]); } }
勤能补拙,熟能生巧