读书人

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

发布时间: 2012-04-04 16:38:51 作者: rapoo

对字符串快速排序
要求根据选择结构体中的元素作为关键字对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);
}

读书人网 >C语言

热点推荐