冒泡:
#include <stdio.h>
#include <string.h>
bubble(strings,count)
char *strings;
intcount;
{
registerintm,n;
registerchars;
for(m = 1;m<count;m++)
for(n = count-1;n >= m;--n)
{
if(strings[n-1]>strings[n])
{
s = strings[n-1];
strings[n-1] = strings[n];
strings[n] = s;
}
}
}
intmain(void)
{
intcount;
charstr[200];
printf("请输入字符串:/n");
gets(str);
count = strlen(str);
bubble(str,count);
printf("排序之后的字符串是:/n");
printf("%s./n",str);
return 0;
}
堆排序:
#include <stdio.h>
#define MARK 0
statica[8] = {MARK,25,4,36,1,60,10,58,};
intcount = 1;
voidheap(intn);
voidadjust(inti,intn);
intmain(void)
{
inti;
printf("源数据为:");
for(i = 1;i<8;i++)
printf("%5d",a[i]);
heap(7);
printf("/n排序后的数据为:");
for(i = 1;i<8;i++)
printf("%5d",a[i]);
printf("/n");
return 0;
}
voidheap(n)
intn;
{
inti,j,t;
for(i =n/2;i>0;i--)
adjust(i,n);
printf("/n初始化成堆===> ");
for(i = 1;i < 8;i++)
printf("%5d",a[i]);
for(i = n-1;i>0;i--)
{
t = a[i+1];
a[i+1] = a[1];
a[1] = t;
adjust(1,i);
printf("/n第%2d步操作结果===>",count++);
for(j = 1;j<8;j++)
printf("%5d",a[j]);
}
}
voidadjust(i,n)
inti,n;
{
intj,k,r,done=0;
k = r = a[i];
j = 2*i;
while((j<=n)&&(done==0))
{
if(j<n)
{
if(a[j]<a[j+1])
j++;
}
if(k>=a[j])
done = 1;
else
{
a[j/2] = a[j];
j = 2* j;
}
}
a[j/2] = r;
}
文件排序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM 4
struct data
{
char name[20];
char school[20];
char city[20];
char province[20];
}info;
struct data addrs[NUM]=
{
"WenHai","BIT","JiLin","JiLin",
"TongWei","BIT","ZhengJiang","JiangSu",
"SunYou","BIT","WeiFang","ShangDong",
"XiaoMing","PKU","TaiYuan","ShanXi"
};
/*对后面要用到的函数进行声明*/
void quick_disk(FILE *fp,int count);
void qs_disk(FILE *fp,intleft,intright);
void exchangedata(FILE *fp,long i, long j);
char *get_name(FILE *fp, long rec);
void print_data(struct data *p);
struct data *get_data(FILE *fp,long rec);
int main(void)
{
inti;
FILE *fp; /*文件指针*/
/*以读写方式生成文本文件fp*/
if((fp = fopen("datalist.txt","w+")) == NULL)
{
printf("打开文件失败/n");
exit(1);
}
printf("将未排序的数据写入文件/n");
/*将数组Sdata[NUM]写入文件中*/
fwrite(addrs,sizeof(addrs),1,fp);
/*将文件中的数组Sdata[NUM]依次取出并打印*/
for(i=0;i<NUM;i++)
{
struct data *p;
p = get_data(fp,i); /*得到Sdata[i]的指针*/
print_data(p); /*将结构体Sdata[i]各个成员变量打印出*/
printf("/n");
}
fclose(fp); /*关闭文件指针*/
/*以二进制方式再次打开文件datalist.txt*/
if((fp=fopen("datalist.txt","rb+"))==NULL)
{
printf("不能以读写方式打开文件/n");
exit(1);
}
printf("将文件数据排序/n");
/*调用字符串排序函数将文本中的字符串结构体排序*/
quick_disk(fp,NUM);
printf("排序结束/n");
/*将排序结束后的数组数据打印出来*/
for(i=0;i<4;i++)
{
struct data *p;
p = get_data(fp,i);
print_data(p);
printf("/n");
}
fclose(fp);
return 0;
}
/*应用快速排序方法对字符串进行排序*/
void quick_disk(FILE *fp,int count)
{
qs_disk(fp,0,count-1);
}
/*排序函数*/
void qs_disk(FILE *fp,intleft,intright)
{
long inti,j;
char x[30];
i = left;
j = right;
/*比较字符串x为Sdata数组中间一个结构变量的name成员变量*/
strcpy(x,get_name(fp,(long)(i+j)/2));
do
{ /*比较当前结构变量的name成员变量于比较字符串x的大小*/
while((strcmp(get_name(fp,i),x)<0)&&(i<right))
i++;
while((strcmp(get_name(fp,j),x)>0)&&(j>left))
j--;
if(i<=j)
{
exchangedata(fp,i,j); /*交换i和j对应的数据*/
i++;
j--;
}
}while(i<j);
if(left<j) /*反复调用此排序函数,直到j达到数据的最左端*/
qs_disk(fp,left,(int)j);
if(i<right) /*反复调用此排序函数,直到i达到数据的最右端*/
qs_disk(fp,(int)i,right);
}
/*交换i和j在文件中对应的数据*/
void exchangedata(FILE *fp,long i,long j)
{
char a[sizeof(info)],b[sizeof(info)];
fseek(fp,sizeof(info)*i,SEEK_SET); /*找到i在文件中对应的数据位置*/
fread(a,sizeof(info),1,fp); /*将该位置数据读到字符串数组a中*/
fseek(fp,sizeof(info)*j,SEEK_SET); /*找到j在文件中对应的数据位置*/
fread(b,sizeof(info),1,fp); /*将该位置数据读到字符串数组b中*/
fseek(fp,sizeof(info)*j,SEEK_SET); /*找到j在文件中对应的数据位置*/
fwrite(a,sizeof(info),1,fp); /*将刚才读入a中的数据写入到该位置*/