凯鲁嘎吉
用书写铭记日常,最迷人的不在远方
  1 #include<stdio.h>
  2 #include<stdlib.h>
//作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/
  3 #define N 20
  4 //冒泡排序
  5 void bubble(int a[],int n){
  6     int i,j,temp;
  7     for(i=0;i<n-1;i++){
  8         for(j=0;j<n-1-i;j++){
  9             if(a[j]>a[j+1]){
 10                 temp=a[j];
 11                 a[j]=a[j+1];
 12                 a[j+1]=temp;
 13             }
 14         }
 15     }
 16 }
 17 
 18 //选择排序
 19 void select(int a[],int n){
 20     int i,j,min,temp;
 21     for(i=0;i<n-1;i++){
 22         min=i;
 23         for(j=i+1;j<n;j++){
 24             if(a[j]<a[min]){
 25                 min=j;
 26             }
 27         }
 28         if(min!=i){
 29             temp=a[i];
 30             a[i]=a[min];
 31             a[min]=temp;
 32         }
 33     }
 34 }
 35 //直接插入排序
 36 void insert(int a[],int n){
 37     int i,j,temp;
 38     for(i=1;i<n;i++){
 39         temp=a[i];
 40         j=i-1;
 41         while((temp<a[j]) && (j>=0)){
 42             a[j+1]=a[j];
 43             j--;
 44         }
 45         a[j+1]=temp;
 46     }
 47 }
 48 //折半插入排序
 49 void bi_insert(int a[],int n){
 50     int i,j,low,high,mid,temp;
 51     for(i=1;i<n;i++){
 52         temp=a[i];
 53         low=0;
 54         high=i-1;
 55         while(low<=high){
 56             mid=(low+high)/2;
 57             if(a[mid]>temp){
 58                 high=mid-1;
 59             }
 60             else
 61                 low=mid+1;
 62         }
 63         for(j=i-1;j>=high+1;--j){
 64             a[j+1]=a[j];
 65         }
 66         a[high+1]=temp;
 67     }
 68 }
 69 //堆排序
 70 void sift(int a[],int low,int high){
 71     int i=low,j=i*2,t=a[i];
 72     while(j<=high){
 73         if(j<high && a[j]<a[j+1]){
 74             ++j;
 75         }
 76         if(t<a[j]){
 77             a[i]=a[j];
 78             i=j;
 79             j=2*i;
 80         }
 81         else
 82             break;
 83     }
 84     a[i]=t;
 85 }
 86 
 87 void heap(int a[],int n){
 88     int i,temp;
 89     for(i=n/2;i>=1;--i){
 90         sift(a,i,n);
 91     }
 92     for(i=n;i>=2;--i){
 93         temp=a[i];
 94         a[i]=a[1];
 95         a[1]=temp;
 96         sift(a,1,i-1);
 97     }
 98 }
 99 
100 
101 void main(){
102     int a[N];
103     int i,k,m;
104     printf("Please input a number:");
105     scanf("%d",&m);
106     printf("Please input %d numbers:\n",m);
107     for(i=0;i<m;i++){
108         scanf("%d",a+i);
109     }
110     while(1){
111         printf("1.冒泡排序\n2.选择排序\n3.直接插入排序\n4.折半插入排序\n5.堆排序\n0.exit\nPlease choose:");
112         scanf("%d",&k);
113         switch(k)
114         { 
115         case 1: bubble(a,m);break;
116         case 2: select(a,m);break;
117         case 3: insert(a,m);break;
118         case 4: bi_insert(a,m);break;
119         case 5: heap(a,m-1);break;
120         case 0: printf("Byebye!\n");system("pause");exit(0);
121         default :printf("Input error!\nPlease choose again:\n");continue;
122         }
123         printf("Result:\n");
124         for(i=0;i<m;i++){
125             printf("%4d",a[i]);
126         }
127         printf("\n");
128     }
129     system("pause");
130 }

结果为:

 

posted on 2018-03-17 16:50  凯鲁嘎吉  阅读(691)  评论(0编辑  收藏  举报