#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