欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言 排序算法总结

程序员文章站 2022-10-03 12:39:26
结果为: ......
  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 }

结果为:

C语言 排序算法总结

C语言 排序算法总结