首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

对字符串快速排序解决方案

2012-04-04 
对字符串快速排序要求根据选择结构体中的元素作为关键字对Record进行排序,不知道哪里出了问题,请大家帮帮

对字符串快速排序
要求根据选择结构体中的元素作为关键字对Record进行排序,不知道哪里出了问题,请大家帮帮我!

=======================================================================
#include   <stdio.h>
#include   <stdlib.h>
#include   <string.h>
#define   N   100

typedef   struct   record{
              char   title[N];           /*   主标题名     */
              char   subtitle[N];     /*     副标题名*/
              char   date[N];       /*     完成日期   */
              char   path[N];       /*     存放路径   */
              char   classfication[N];     /*     文件分类   */
}Record;

Record   data[N];

int   sort_data(Record   *recd,   int   start,   int   count);       //     快速排序  
int   display(Record   *recd,   int   count);     //     向屏幕输出函数  

int   main()
{
      int   m;

      FILE   *fp_read;
      fp_read   =   fopen( "12-003.txt ",   "r ");
   
      if(fp_read   ==   NULL){
          printf( "Can   not   open   file!\n ");
          return   -1;
          }
      /*     从   文件读如数据     */
      for(m=0;   m <10;   m++){
            fscanf(fp_read, "%s\t ",   data[m].title);
            fscanf(fp_read, "%s\t ",   data[m].subtitle);    
            fscanf(fp_read, "%s\t ",   data[m].date);      
            fscanf(fp_read, "%s\t ",   data[m].path);      
            fscanf(fp_read, "%s\n ",   data[m].classfication);      
        }        
    int   count   =   m;
    count   =   display(data,count);
    count   =   sort_data(data,0,count);
    count   =   display(data,count);

    fclose(fp_read);
    return   0;
  }

int   display(Record   *recd,   int   count)
{
    int   i   =   0;

    while(i   <   count){
                  printf( "%d         ",   ++i);
                  printf( "%s         ",   recd   -> title);                  
                  printf( "%s         ",   recd   -> subtitle);          
                  printf( "%s         ",   recd   -> date);


                  printf( "%s         ",   recd   -> path);
                  printf( "%s\n ",   recd   -> classfication);
                  recd++;
                }  
      return   count;
}

/*     快速排序函数   */
int   sort_data(Record   *recd,   int   start,   int   count)
{
      int   i   =   start,   j   =   count;
      char   pivot[30];
      Record   *key[count];      
      Record   temp;

      int   selete_vaule;
      printf( "which   item   do   you   want   to   sort?\n ");
      printf( "1.title\n ");
      printf( "2.subtitle\n ");
      printf( "3.date\n ");
      printf( "4.path\n ");
      printf( "5.classfication\n ");

      scanf( "%d ",   &selete_vaule);

      switch(selete_vaule){

      case   1:   for(i=0;   i <count;   i++)   {
                      strcpy(key[i],recd   -> title);
                      recd++;
          }
                     
      case   2:     for(i=0;   i <10;   i++)   {
                      strcpy(key[i],recd   -> subtitle);
                      recd++;
          }
      case   3:     for(i=0;   i <10;   i++){  
                      strcpy(key[i],recd   -> date);
                      recd++;
          }
      case   4:     for(i=0;   i <10;   i++){
                      strcpy(key[i],recd   -> path);
                      recd++;
          }
      case   5:     for(i=0;   i <10;   i++){  
                      strcpy(key[i],recd   -> classfication);
                      recd++;
          }
      }
   
      strcpy(pivot,key[(start   +   count)/2]);

      do{
              int   result   =   strcmp(key[i],   pivot);
              while(result   <   0   &&   i   <   count)   i++;


              while(result   >   0   &&   j   >   count)   j--;
     
              if(i   <=j   ){
                      temp   =   recd[i];
                      recd[i]   =   recd[j];
                      recd[j]   =   temp;
                      i++;     j--;
          }
          }while(i   <=   j);

        if(start   <   j)    
                    sort_data(key,   start,   i-1);
        if(i   <   count)  
                    sort_data(key,   j+1,   count);

        return   count;

}

=======================================================================
/*       12-3.txt       */
c1-2.c         1-2.c         2007-04-21         /home/softC/01         c_source
c1-4.c         1-4.c         2007-04-21         /home/softC/01         c_source
c1-6.c         1-6.c         2007-04-21         /home/softC/01         c_source
c2-5.c         2-5.c         2007-04-24         /home/softC/02         c_source
c3-2.c         3-2.c         2007-05-10         /home/softC/03         c_source
c3-4.c         3-4.c         2007-05-09         /home/softC/03         c_source
c3-7.c         3-7.c         2007-05-10         /home/softC/03         c_source
c4-2.c         4-2.c         2007-05-21         /home/softC/04         c_source
c4-3.c         4-3.c         2007-05-21         /home/softC/04         c_source
c4-8.c         4-8.c         2007-05-17         /home/softC/04         c_source
=========================================================================


[解决办法]
int sort_function( const void *a,const void *b) //定义比较函数
{
return( strcmp(((Record)a.title),((Record))b.title) );
}

count = sort_data(data,0,count);
==> //修改为调用 qsort 就可以
qsort((void *)data, count, sizeof(data[0]), sort_function);
[解决办法]
我帮你把排序改了一下,其实也只需要一个sort就行了。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#define N 100

typedef struct record{
char title[N]; /* 主标题名 */
char subtitle[N]; /* 副标题名*/
char date[N]; /* 完成日期 */
char path[N]; /* 存放路径 */
char classfication[N]; /* 文件分类 */
}Record;

Record data[N];

int sort_data(Record *recd, int start, int count); // 快速排序
int display(Record *recd, int count); // 向屏幕输出函数

int main()
{
int m;
int count; /* 先声明变量 */

FILE *fp_read;
fp_read = fopen( "12-3.txt ", "r "); /* 文件名要一致 */

if(fp_read == NULL){
printf( "Can not open file!\n ");
return -1;
}
/* 从 文件读如数据 */
for(m=0; m <10; m++){
fscanf(fp_read, "%s\t ", data[m].title);
fscanf(fp_read, "%s\t ", data[m].subtitle);
fscanf(fp_read, "%s\t ", data[m].date);
fscanf(fp_read, "%s\t ", data[m].path);
fscanf(fp_read, "%s\n ", data[m].classfication);
}
/* int count = m;*/ count = m;printf ( "%d\n ", m);


count = display(data,count);
count = sort_data(data,0,count);
count = display(data,count);

fclose(fp_read);
return 0;
}

int display(Record *recd, int count)
{
int i = 0;

while(i < count){
printf( "%d ", ++i);
printf( "%s ", recd -> title);
printf( "%s ", recd -> subtitle);
printf( "%s ", recd -> date);
printf( "%s ", recd -> path);
printf( "%s\n ", recd -> classfication);
recd++;
}
return count;
}

/* 快速排序函数 */
int sort_data(Record *recd, int start, int count)
{
int i = start, j = count;
char pivot[30];

int selete_vaule;
printf( "\nwhich item do you want to sort?\n ");
printf( "1.title\n ");
printf( "2.subtitle\n ");
printf( "3.date\n ");
printf( "4.path\n ");
printf( "5.classfication\n ");

scanf( "%d ", &selete_vaule);


/* 按从小到大的顺序排列 */
switch(selete_vaule){

case 1:
{
for(i=0; i <count-1; i++)
{
for (j=i+1; j <count; j++)
{
if (strcmp (data[i].title, data[j].title) > 0)
{
strcpy (pivot, data[i].title);
strcpy (data[i].title, data[j].title);
strcpy (data[j].title, pivot);
}
}
}
break;

}

case 2:
{
for(i=0; i <count-1; i++)
{
for (j=i+1; j <count; j++)
{
if (strcmp (data[i].subtitle, data[j].subtitle) > 0)
{
strcpy (pivot, data[i].subtitle);
strcpy (data[i].subtitle, data[j].subtitle);
strcpy (data[j].subtitle, pivot);
}
}
}
break;
}
case 3:
{

for(i=0; i <count-1; i++)
{
for (j=i+1; j <count; j++)
{
if (strcmp (data[i].date, data[j].date) > 0)
{
strcpy (pivot, data[i].date);
strcpy (data[i].date, data[j].date);
strcpy (data[j].date, pivot);
}
}
}
break;
}
case 4:
{
for(i=0; i <count-1; i++)
{
for (j=i+1; j <count; j++)
{
if (strcmp (data[i].path, data[j].path) > 0)
{
strcpy (pivot, data[i].date);
strcpy (data[i].path, data[j].path);
strcpy (data[j].path, pivot);
}
}
}
break;
}
case 5:
{
for(i=0; i <count-1; i++)


{
for (j=i+1; j <count; j++)
{
if (strcmp (data[i].classfication, data[j].classfication) > 0)
{
strcpy (pivot, data[i].classfication);
strcpy (data[i].classfication, data[j].classfication);
strcpy (data[j].classfication, pivot);
}
}
}
break;
}


}
return count;

}
[解决办法]
if (strcmp (data[i].title, data[j].title) > 0) /* 这里我不想用全局变量data而是想用rece,该怎么写啊? 我写成if(strcmp(recd[i] -> title, recd[j] -> title) > 0) 为什么不行啊?正确的写法是什么啊*/
----------------------------------------
应该这样写:recd
if (strcmp ((recd+i)-> title, (recd+j)-> title) > 0)
{
strcpy (pivot, (recd+i)-> title);
strcpy ((recd+i)-> title, (recd+j)-> title);
strcpy ((recd+j)-> title, pivot);
}

热点排行