数据结构排序

#define N 11
#define M 10
#include<stdio.h>
/*全局文件指针*/
FILE *prtOutput;
/*
插入排序的基本操作就是将一个记录插入到已经排好序的有序表中,从而得到新的,记录数新增1的有序表
有序表一开始就是表中的第一个数,然后将第二个数插入到的左边或者右边,再插入第三个数,插入的第三个
数先和第二数比较,如果比第二个数大就顺序就不变,如果比第二个数小,就要和第一个数比较决定放在第
一个数的左边还是右边。
*/
void Insertsort(int r[])
{
  int i,j,k;
  int p=0;
  for(i=1;i<N;i++)
  {
      if(r[i]<r[i-1])
      {
        p=r[i];
        for(j=i-1;r[j]>p&&j>=0;j--)
        {
            r[j+1]=r[j];
        }
        r[j+1]=p;
      }
   printf("第%2d次:",i);
   fprintf(prtOutput,"第%2d次:",i);
   for(k=0;k<N;k++){
		printf("%5d",r[k]);
		fprintf(prtOutput,"%5d",r[k]);
   }
   fprintf(prtOutput,"\n");
   printf("\n");
  }
}
/*希尔排序是将整个序列分割成若干个小的序列,然后保证小的序列基本有序,再保证大的序列基本有序
所谓的基本有序是指小的关键子基本在前面,大的基本在后面,不大不小的在中间,但是整个序列不一样
是有序的。
分割成子序列是将相距某个固定增量的记录组成一个子序列。
本例中是先分组间隔为5+1+1的序列进行排序
再分成3+1+1的序列进行排序
最次减小,最后就是一个有序序列
*/
void Shellsort(int r[])
{
  int i,x,gap,m=1,k;
  gap=N;                /*增量置初值*/
  while(gap>2)
  {
      gap=gap/2+1;                 /*减小增量*/
      for(i=gap;i<N;i++)
     {
       if(r[i-gap]>r[i])
        {
          x=r[i];            /*将r[j]与r[j+gap]交换*/
          r[i]=r[i-gap];
          r[i-gap]=x;
        }
      printf("第%2d次交换: ",m);
	  fprintf(prtOutput,"第%2d次交换:",m);
      for(k=0;k<N;k++){
		printf("%5d",r[k]);
		fprintf(prtOutput,"%5d",r[k]);
	  }
      printf("\n");fprintf(prtOutput,"\n");
      m++;
     }
  }
}
/*冒泡排序很简单,序列就是将大的数想水下的泡泡一样,慢慢的冒到面上来
*/
void Bubblesort(int r[])
 {
  int i,j,w,k=1,m;
  for(i=0;i<N;i++)
   for(j=N-1;j>i;j--)
    if(r[j]<r[j-1])              /*比较*/
     {
       w=r[j];                   /*r[j]和r[j-1]交换*/
       r[j]=r[j-1];
       r[j-1]=w;
       printf("第%2d次交换:",k);
	   fprintf(prtOutput,"第%2d次交换:",k);
       for(m=0;m<N;m++){
			printf("%5d",r[m]);
			fprintf(prtOutput,"%5d",r[m]);
	   }
       printf("\n");fprintf(prtOutput,"\n");
       k++;
     }
 }
/*简单选择排序:先从整个序列找出最小的那个,然后将序列的第一个与它交换
然后再从剩下的序列中找出最小,放将第二个位置的数和它交换
依次往下进行。。。。。。
*/
void Selectsort(int r[])
{
 int i,j,k,temp,a=1,b;
 for(i=0;i<N;i++)
  {
   k=i;
   for(j=i+1;j<N;j++)    /*用k指出每趟在无序区段的最小元素*/
    if(r[j]<r[k]) k=j;
    temp=r[i];           /*将r[k]与r[i]交换*/
    r[i]=r[k];
    r[k]=temp;
    printf("第%2d次交换:",a);
	fprintf(prtOutput,"第%2d次交换:",a);
    a++;
    for(b=0;b<N;b++){
		printf("%5d",r[b]);
		fprintf(prtOutput,"%5d",r[b]);
	}
    printf("\n");fprintf(prtOutput,"\n");
  }
}

void Merge(int r[],int l,int m,int h,int r2[])
{                        /*r[l,m]及r[m+1,h]分别有序,归并后置r2中*/
  int i,j,k,a,c=1;
  k=i=l;          /*k是r2的指示器,i,j分别为r[l…m]和r[m+1…h]的指示器*/
  j=m;
  while(i<=m && j<=h)
   {
    if(r[i]<=r[j])
     {
      r2[k]=r[i];
      i++;
      printf("第%2d次复制:",c);
	  fprintf(prtOutput,"第%2d次复制:",c);
      c++;
      for(a=0;a<M;a++){
			printf("%5d",r2[a]);
			fprintf(prtOutput,"%5d",r2[a]);
	  }
      printf("\n");fprintf(prtOutput,"\n");
     }
    else
     {
      r2[k]=r[j];
      j++;
	  printf("第%2d次复制:",c);
	  fprintf(prtOutput,"第%2d次复制:",c);
      c++;
      for(a=0;a<M;a++){
		printf("%5d",r2[a]);
		fprintf(prtOutput,"%5d",r2[a]);
	  }
      printf("\n");fprintf(prtOutput,"\n");
     }
    k++;
   }
   if(i>m)                        /*r[l,m]结束*/
    while(j<=h)
    {
     r2[k]=r[j];                  /*将r[m+1,h]剩余的复制到r2中*/
     j++; k++;
     printf("第%2d次复制:",c);
	 fprintf(prtOutput,"第%2d次复制:",c);
      c++;
      for(a=0;a<M;a++){
		printf("%5d",r2[a]);
		fprintf(prtOutput,"%5d",r2[a]);
	  }
      printf("\n");fprintf(prtOutput,"\n");
    }
   else
    while(i<=m)
    {
     r2[k]=r[i];                     /*将r[l,m]剩余的复制到r2中*/
     i++; k++;
	 printf("第%2d次复制:",c);
	 fprintf(prtOutput,"第%2d次复制:",c);
      c++;
      for(a=0;a<M;a++){
		printf("%5d",r2[a]);
		fprintf(prtOutput,"%5d",r2[a]);
	  }
      printf("\n");fprintf(prtOutput,"\n");
    }

}

void Sift(int r[],int l,int m)
{
 int i,j,x;
 i=l;
 j=2*i;             /*r[j]是r[i]的左孩子*/
 x=r[i];
 while(j<=m)
 {                    /*若右孩子较大,则把j修改为右孩子的下标*/
   if((j<m) && (r[j]<r[j+1]))
    j++;
   if(x<r[j])
    {
     r[i]=r[j];        /*将r[j]调到父亲的位置上*/
     i=j;              /*修改i和j的值,以便继续向下筛*/
     j=2*i;
    }
   else
    j=m+1;            /*筛选完成,令j=m+1,以便中止循环*/
 }
  r[i]=x;             /*被筛选点的值放入最终的位置*/

}
void Heapsort(int r[])
{
 int i,m,a,k=N-1,c=1;
 for(i=(N-1)/2;i>0;i--)
  Sift(r,i,k);
  for(i=N-1;i>1;i--)
  {
   m=r[i];
   r[i]=r[1];
   r[1]=m;
   printf("第%2d次筛选:",c);
   fprintf(prtOutput,"第%2d次筛选:",c);
   c++;
   for(a=0;a<N;a++){
	   printf("%5d",r[a]);
	   fprintf(prtOutput,"%5d",r[a]);
   }
   printf("\n");fprintf(prtOutput,"\n");
   Sift(r,1,i-1);
  }
}
/*
快速排序,排序原理很简单,一开始就是将找一个数,这个数左边的都比它小,右边的都比它大
这样就有两个序列,然后递归的调用自己,找出左边的序列中间那个数,再找出右边的序列那个数
*/
void Quicksort(int r[],int m,int n)   /*k为交换次数的计数器*/
 {//m为low ,n为high
  int i=m,j=n,q,temp;
  if(m<n)
   {
    temp=r[i];
    do
     {
      while((i<j) && (r[j]>temp))
       j--;
      if(i<j)
      {
	   r[i]=r[j];         /*小者前移且i后移一个位置*/
	   i++;
	   for(q=0;q<N;q++){
			printf("%5d",r[q]);
			fprintf(prtOutput,"%5d",r[q]);
	   }
	   printf("\n");fprintf(prtOutput,"\n");
      }
      while((i<j) && (r[i]<=temp))
       i++;
      if(i<j)
       {
	    r[j]=r[i];    /*大者后移且j前移*/
	    j--;
		for(q=0;q<N;q++){
			printf("%5d",r[q]);
			fprintf(prtOutput,"%5d",r[q]);
		}
	    printf("\n");fprintf(prtOutput,"\n");
       }
     }while(i<j);
    r[i]=temp;
	for(i=0;i<N;i++){
		printf("%5d",r[i]);
		fprintf(prtOutput,"%5d",r[i]);
	}
		printf("\n");fprintf(prtOutput,"\n");
    Quicksort(r,m,j-1);
    Quicksort(r,j+1,n);
   }
 }

int main()
{/*1*/
    int r[N],i,p1,r2[N-1]={0,0,0,0,0,0,0,0,0,0},m=M/2,h=M,d=0,z;
/*定义文件指针*/
	FILE *fp;
	prtOutput=fopen("output.txt","w");

	fclose(prtOutput);
	prtOutput=fopen("output.txt","a");
	for(z=1;z<2;z++)
	{/*2*/
	  switch(z)
	  {/*3*/

	    case 1:
		{/*4*/
		  for(p1=1;p1<7;p1++)
		  {/*5*/
            /*以下用文件代替*/
	        /*printf("请输入待排序的数据:\n");
		   for(i=0;i<N;i++)
      	    scanf("%d",&r[i]);            /*r[0]是哨兵*/
		    /*从文件读入*/
		    fp=fopen("input1.txt","r");
		    for(i=0;i<N;i++)  fscanf(fp,"%d",&r[i]);
		    fclose(fp);

		    /*以下实现具体排序*/
		    printf("\n提示:r[0]是哨兵\n\n");
     	    printf("原来的数据顺序是:");
     	    for(i=0;i<N;i++)  printf("%5d",r[i]);
     	    printf("\n\n");
		    switch(p1)
			{/*6*/
		       case 1: printf("**************插入排序法**************");
				       fprintf(prtOutput,"**************插入排序法**************");
			           printf("\n\n");
					   fprintf(prtOutput,"\n\n");
                       Insertsort(r);
                       printf("\n");fprintf(prtOutput,"\n");
					   break;
               case 2: printf("**************希尔排序法**************");
					   fprintf(prtOutput,"**************希尔排序法**************");
                       printf("\n\n");
					   fprintf(prtOutput,"\n\n");
			           Shellsort(r);
                       printf("\n");fprintf(prtOutput,"\n");
					   break;
               case 3: printf("**************冒泡排序法**************");
					   fprintf(prtOutput,"**************冒泡排序法**************");
                       printf("\n\n");
					   fprintf(prtOutput,"\n\n");
			           Bubblesort(r);
                       printf("\n");fprintf(prtOutput,"\n");
					   break;
               case 4: printf("**************简单选择排序法**************");
					   fprintf(prtOutput,"**************简单选择排序法**************");
                       printf("\n\n");
					   fprintf(prtOutput,"\n\n");
			           Selectsort(r);
                       printf("\n");fprintf(prtOutput,"\n");
					   break;
               case 5: printf("**************堆排序法**************");
					   fprintf(prtOutput,"**************堆排序法**************");
                       printf("\n\n");
					   fprintf(prtOutput,"\n\n");
			           Heapsort(r);
                       printf("\n");fprintf(prtOutput,"\n");
					   break;
               case 6: printf("**************快速排序法**************");
					   fprintf(prtOutput,"**************快速排序法**************");
                       printf("\n\n");
					   fprintf(prtOutput,"\n\n");
			           Quicksort(r,0,h);
                       printf("\n");
					   fprintf(prtOutput,"\n");
					   break;
			}/*6*/
		  }/*5*/
		  }/*4*/

	 case 2:
		 {/*7*/
			 fp=fopen("input2.txt","r");
		     for(i=0;i<M;i++)  fscanf(fp,"%d",&r[i]);
		     fclose(fp);
			 printf("原来的数据顺序是:");
     	     for(i=0;i<M;i++)  printf("%5d",r[i]);
     	     printf("\n\n");
		     printf("**************归并排序法**************");
			 fprintf(prtOutput,"**************归并排序法**************");
             printf("\n\n");
			 fprintf(prtOutput,"\n\n");
			 Merge(r,d,m,h,r2);
             printf("\n");fprintf(prtOutput,"\n");
		     break;
		 }/*7*/
		}/*3*/

	    fclose(prtOutput);   /*关闭文件指针*/
	}/*2*/
	return 0;
}/*1*/

打印结果如下:

**************插入排序法**************

第 1次:   74   85    7    4    1    8    5    2    9    6    3
第 2次:    7   74   85    4    1    8    5    2    9    6    3
第 3次:    4    7   74   85    1    8    5    2    9    6    3
第 4次:    1    4    7   74   85    8    5    2    9    6    3
第 5次:    1    4    7    8   74   85    5    2    9    6    3
第 6次:    1    4    5    7    8   74   85    2    9    6    3
第 7次:    1    2    4    5    7    8   74   85    9    6    3
第 8次:    1    2    4    5    7    8    9   74   85    6    3
第 9次:    1    2    4    5    6    7    8    9   74   85    3
第10次:    1    2    3    4    5    6    7    8    9   74   85

**************希尔排序法**************

第 1次交换:    5   85    7    4    1    8   74    2    9    6    3
第 2次交换:    5    2    7    4    1    8   74   85    9    6    3
第 3次交换:    5    2    7    4    1    8   74   85    9    6    3
第 4次交换:    5    2    7    4    1    8   74   85    9    6    3
第 5次交换:    5    2    7    4    1    8   74   85    9    6    3
第 6次交换:    1    2    7    4    5    8   74   85    9    6    3
第 7次交换:    1    2    7    4    5    8   74   85    9    6    3
第 8次交换:    1    2    7    4    5    8   74   85    9    6    3
第 9次交换:    1    2    7    4    5    8   74   85    9    6    3
第10次交换:    1    2    7    4    5    8   74   85    9    6    3
第11次交换:    1    2    7    4    5    6   74   85    9    8    3
第12次交换:    1    2    7    4    5    6    3   85    9    8   74
第13次交换:    1    2    7    4    5    6    3   85    9    8   74
第14次交换:    1    2    7    4    5    6    3   85    9    8   74
第15次交换:    1    2    6    4    5    7    3   85    9    8   74
第16次交换:    1    2    6    3    5    7    4   85    9    8   74
第17次交换:    1    2    6    3    5    7    4   85    9    8   74
第18次交换:    1    2    6    3    5    7    4   85    9    8   74
第19次交换:    1    2    6    3    5    7    4   85    9    8   74
第20次交换:    1    2    6    3    5    7    4   74    9    8   85
第21次交换:    1    2    6    3    5    7    4   74    9    8   85
第22次交换:    1    2    6    3    5    7    4   74    9    8   85
第23次交换:    1    2    5    3    6    7    4   74    9    8   85
第24次交换:    1    2    5    3    6    7    4   74    9    8   85
第25次交换:    1    2    5    3    4    7    6   74    9    8   85
第26次交换:    1    2    5    3    4    7    6   74    9    8   85
第27次交换:    1    2    5    3    4    7    6   74    9    8   85
第28次交换:    1    2    5    3    4    7    6    8    9   74   85
第29次交换:    1    2    5    3    4    7    6    8    9   74   85

**************冒泡排序法**************

第 1次交换:   74   85    7    4    1    8    5    2    9    3    6
第 2次交换:   74   85    7    4    1    8    5    2    3    9    6
第 3次交换:   74   85    7    4    1    8    2    5    3    9    6
第 4次交换:   74   85    7    4    1    2    8    5    3    9    6
第 5次交换:   74   85    7    1    4    2    8    5    3    9    6
第 6次交换:   74   85    1    7    4    2    8    5    3    9    6
第 7次交换:   74    1   85    7    4    2    8    5    3    9    6
第 8次交换:    1   74   85    7    4    2    8    5    3    9    6
第 9次交换:    1   74   85    7    4    2    8    5    3    6    9
第10次交换:    1   74   85    7    4    2    8    3    5    6    9
第11次交换:    1   74   85    7    4    2    3    8    5    6    9
第12次交换:    1   74   85    7    2    4    3    8    5    6    9
第13次交换:    1   74   85    2    7    4    3    8    5    6    9
第14次交换:    1   74    2   85    7    4    3    8    5    6    9
第15次交换:    1    2   74   85    7    4    3    8    5    6    9
第16次交换:    1    2   74   85    7    4    3    5    8    6    9
第17次交换:    1    2   74   85    7    3    4    5    8    6    9
第18次交换:    1    2   74   85    3    7    4    5    8    6    9
第19次交换:    1    2   74    3   85    7    4    5    8    6    9
第20次交换:    1    2    3   74   85    7    4    5    8    6    9
第21次交换:    1    2    3   74   85    7    4    5    6    8    9
第22次交换:    1    2    3   74   85    4    7    5    6    8    9
第23次交换:    1    2    3   74    4   85    7    5    6    8    9
第24次交换:    1    2    3    4   74   85    7    5    6    8    9
第25次交换:    1    2    3    4   74   85    5    7    6    8    9
第26次交换:    1    2    3    4   74    5   85    7    6    8    9
第27次交换:    1    2    3    4    5   74   85    7    6    8    9
第28次交换:    1    2    3    4    5   74   85    6    7    8    9
第29次交换:    1    2    3    4    5   74    6   85    7    8    9
第30次交换:    1    2    3    4    5    6   74   85    7    8    9
第31次交换:    1    2    3    4    5    6   74    7   85    8    9
第32次交换:    1    2    3    4    5    6    7   74   85    8    9
第33次交换:    1    2    3    4    5    6    7   74    8   85    9
第34次交换:    1    2    3    4    5    6    7    8   74   85    9
第35次交换:    1    2    3    4    5    6    7    8   74    9   85
第36次交换:    1    2    3    4    5    6    7    8    9   74   85

**************简单选择排序法**************

第 1次交换:    1   85    7    4   74    8    5    2    9    6    3
第 2次交换:    1    2    7    4   74    8    5   85    9    6    3
第 3次交换:    1    2    3    4   74    8    5   85    9    6    7
第 4次交换:    1    2    3    4   74    8    5   85    9    6    7
第 5次交换:    1    2    3    4    5    8   74   85    9    6    7
第 6次交换:    1    2    3    4    5    6   74   85    9    8    7
第 7次交换:    1    2    3    4    5    6    7   85    9    8   74
第 8次交换:    1    2    3    4    5    6    7    8    9   85   74
第 9次交换:    1    2    3    4    5    6    7    8    9   85   74
第10次交换:    1    2    3    4    5    6    7    8    9   74   85
第11次交换:    1    2    3    4    5    6    7    8    9   74   85

**************堆排序法**************

第 1次筛选:   74    3    9    5    7    8    4    2    1    6   85
第 2次筛选:   74    6    8    5    7    3    4    2    1    9   85
第 3次筛选:   74    1    7    5    6    3    4    2    8    9   85
第 4次筛选:   74    2    6    5    1    3    4    7    8    9   85
第 5次筛选:   74    4    3    5    1    2    6    7    8    9   85
第 6次筛选:   74    2    3    4    1    5    6    7    8    9   85
第 7次筛选:   74    1    3    2    4    5    6    7    8    9   85
第 8次筛选:   74    2    1    3    4    5    6    7    8    9   85
第 9次筛选:   74    1    2    3    4    5    6    7    8    9   85

**************快速排序法**************

    3   85    7    4    1    8    5    2    9    6    3
    3   85    7    4    1    8    5    2    9    6   85
    3    6    7    4    1    8    5    2    9    6   85
    3    6    7    4    1    8    5    2    9   74   85
    2    6    7    4    1    8    5    2    9   74   85
    2    6    7    4    1    8    5    6    9   74   85
    2    1    7    4    1    8    5    6    9   74   85
    2    1    7    4    7    8    5    6    9   74   85
    2    1    3    4    7    8    5    6    9   74   85
    1    1    3    4    7    8    5    6    9   74   85
    1    2    3    4    7    8    5    6    9   74   85
    1    2    3    4    7    8    5    6    9   74   85
    1    2    3    4    6    8    5    6    9   74   85
    1    2    3    4    6    8    5    8    9   74   85
    1    2    3    4    6    5    5    8    9   74   85
    1    2    3    4    6    5    7    8    9   74   85
    1    2    3    4    5    5    7    8    9   74   85
    1    2    3    4    5    6    7    8    9   74   85
    1    2    3    4    5    6    7    8    9   74   85

**************归并排序法**************

第 1次复制:   61    0    0    0    0    0    0    0    0    0
第 2次复制:   61   87    0    0    0    0    0    0    0    0
第 3次复制:   61   87  170    0    0    0    0    0    0    0
第 4次复制:   61   87  170  275    0    0    0    0    0    0
第 5次复制:   61   87  170  275  426    0    0    0    0    0
第 6次复制:   61   87  170  275  426  503    0    0    0    0
第 7次复制:   61   87  170  275  426  503  512    0    0    0
第 8次复制:   61   87  170  275  426  503  512  653    0    0
第 9次复制:   61   87  170  275  426  503  512  653   85    0
第10次复制:   61   87  170  275  426  503  512  653   85  897
第11次复制:   61   87  170  275  426  503  512  653   85  897
第12次复制:   61   87  170  275  426  503  512  653   85  897

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值