#define N 10
#include<stdio.h> void select_sort(int *A);//选择排序 void bubble_sort(int *A);//冒泡排序 void exchange_sort(int *A);//交换排序 void shell_sort(int *A);//谢尔排序 void swap(int &value1,int &value2);//实现两个数值的交换 void insert_sort(int *A);//插入排序 void insert(int *A,int k);//将一个新元素k插入到已经排好序的数组中 void radix_sort(int *A);//基数排序 int maxNumber(int *A);//传回数组中最大的整数 int maxdigit(int no);//传回整数的位数,0代表1位数,1代表2位数—— int digitk(int no,int kth);//传回第k位数字 void quick_sort(int *A,int left,int right);//快速排序算法 void merge_sort(int *A,int left,int right);//归并排序算法 //将两个数列归并成新的数列 void merge(int *A1,int A1_start,int *A2,int A2_start,int A2_end,int *A3,int A3_start,int A3_end); void main() { int i=0; int k; int A[]={37,20,15,40,50,60,32,80,78,100}; printf("Data before sorting:"); for(i=0;i<N;i++) { if(i%6==0) printf("/n A[%d]=%4d ",i,A ); else printf("A[%d]=%4d ",i,A); } printf("/n"); //调用各种排序方法,择其一 //select_sort(A);//调用选择排序 //insert_sort(A);//调用插入排序 //shell_sort(A);//调用谢尔排序 //radix_sort(A);//调用基数排序 quick_sort(A,0,N-1); 调用快速排序 // merge_sort(A,0,N-1);//调用归并排序 printf("Data after sorting:"); for(i=0;i<N;i++) { if(i%6==0) printf("/n A[%d]=%4d ",i,A); else printf("A[%d]=%4d ",i,A); } printf("/n"); printf("Please input k inserting number:"); scanf("%d",&k); insert(A,k); printf("Data after inserting:"); for(i=0;i<=N;i++) { if(i%6==0) printf("/n A[%d]=%4d ",i,A); else printf("A[%d]=%4d ",i,A); } printf("/n"); } void insert_sort(int *A)//插入排序函数的实现 { int i,j,x; for(i=1;i<N;i++) { x=A; j=i-1; while(j>=0&&A[j]>x) { A[j+1]=A[j]; j--; } A[j+1]=x; } } void insert(int *A,int k)//将新元素k插入数组A中的函数的实现 { int i; if(k>=A[N-1]) A[N]=k; else { i=N-1; k=A; while(i>=0&&A>k) { A=A;A=k; --i; } } } void select_sort(int *A)//选择排序函数的实现 { int i,j,small; for(i=0;i<N-1;i++) { small=i; for(j=i+1;j<N;j++) if(A[small]>A[j]) small=j; swap(A,A[small]); } } void bubble_sort(int *A) { int i,j,xflag=0; for(i=0;(i<=N-2)&&(xflag==0);i++) { xflag=1; for(j=0;j<N-i-2;j++) { if(A[j]>A[j+1]) { swap(A[j],A[j+1]); xflag=0; } } } } void exchange_sort(int *A)//交换排序算法的实现 { int i,j; for(i=0;i<=N-2;i++) for(j=i+1;j<=N-1;j++) if(A>A[j]) swap(A,A[j]); } void swap(int &value1,int &value2)//交换两个数值的函数的实现 { int temp; temp=value2; value2=value1; value1=temp; } void shell_sort(int *A)//谢尔排序算法的实现 { int i,j,x,hcount,hgroup; for(hcount=2;hcount<(N/2);hcount=hcount*2) { for(hgroup=1;hgroup<=hcount-1;hgroup++) { //插入排序 for(i=hgroup;i<=N-1;i+=hcount) { x=A; j=i-hcount; while(j>=0&&A[j]>x) { A[j+hcount]=A[j]; j-=hcount; } A[j+hcount]=x; } } } insert_sort(A);//最后调用插入排序算法 /* for(i=1;i<=N-1;i++) { x=A; j=i-1; while(j>=0&&A[j]>x) { A[j+1]=A[j]; j--; } A[j+1]=x; }*/ } void radix_sort(int *A) { int i,j,k,index,no; int maxno; int digitno; int nocount[10]={0,0,0,0,0,0,0,0,0,0}; int noarray[10][N]; maxno=maxNumber(A); digitno=maxdigit(maxno); for(i=0;i<=2;i++) { for(j=0;j<=9;j++) nocount[j]=0; for(j=0;j<=N-1;j++) { no=digitk(A[j],i); noarray[no][nocount[no]]=A[j]; nocount[no]=nocount[no]+1; } index=0; for(j=0;j<=9;j++) { for(k=0;k<nocount[j];k++) { A[index]=noarray[j][k]; index++; } } } } int maxNumber(int *A)//传回数组中最大的整数 { int j,max=0; for(j=0;j<N;j++) if(A[j]>=max) max=A[j]; return max; } int maxdigit(int no)//传回整数的位数 { int j; for(j=0;;j++) { no=(int)(no/10); if(no<1) return j; } } int digitk(int no,int kth)//传回第k位数字 { int i,j,m; if(kth==0) return no%10; else { for(j=0;j<kth;j++) { if(j==0) m=10; else m=m*10; } i=((int)(no/m))%10; return i; } } void quick_sort(int *A,int left,int right) { int low,upper,point; if(left<right) { point=A[left]; low=left; upper=right+1; while(1) { while(A[++low]<point);//向右找 while(A[--upper]>point);//向左找 if(low>=upper) break; swap(A[low],A[upper]); } A[left]=A[upper]; A[upper]=point; quick_sort(A,left,upper-1); quick_sort(A,upper+1,right); } } void merge_sort(int *A,int left,int right) { int half; if(left<right) { half=(left+right)/2; merge_sort(A,left,half); merge_sort(A,half+1,right); merge(A,left,A,left,half,A,half+1,right); } } void merge(int *A1,int A1_start,int *A2,int A2_start,int A2_end,int *A3,int A3_start,int A3_end) { int i,j,k=0,h; int B[N]; i=A2_start; j=A3_start; while(i<=A2_end&&j<=A3_end) { if(A2<=A3[j]) B[k++]=A2; else B[k++]=A3[j++]; } while(i<=A2_end) B[k++]=A2; while(i<=A3_end) B[k++]=A3; for(h=0;h<k;h++) A1[A1_start+h]=B[h]; } |
排序

最新推荐文章于 2025-09-12 17:31:31 发布