排序

来源:互联网 发布:淘宝上正品stussy店 编辑:程序博客网 时间:2024/05/01 10:46

: 个人日记 举报举报

#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];
}