现在的位置: 首页 > 综合 > 正文

算法

2013年10月06日 ⁄ 综合 ⁄ 共 5462字 ⁄ 字号 评论关闭
冒泡:
#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;
         /*比较字符串xSdata数组中间一个结构变量的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);              /*交换ij对应的数据*/
                            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);
}
/*交换ij在文件中对应的数据*/
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中的数据写入到该位置*/

抱歉!评论已关闭.