一个大一的C语言问题 题目如下

设计一个函数,对n个字符串按由小到大的顺序排序,n由程序读入,字符串的输入和输出都在main函数中进行
希望尽量 能让我明白的 谢谢了 时间及 明天8点之前能看到最好
可加我 1139136093 按字典顺序

为什么同一个程序,有的效率很高,有的不好?
算法是程序的灵魂。
3楼的很好吗?如果有1000个字符串,那么排序是不是就要复制很多次?再说字符串长度未必一致,长短不同的字符串复制合理吗?虽然规定每个字符串不超过50字节,但在算法上是不合理的,如果字符串有10000个,100000个,请问去这样复制法去哪里找效率?
怎么办?根本不必交换字符串的内容,只要交换指向字符串的地址,由于字符串的地址是一个16进制数,只交换一个数值比复制整个字符串效率高太多。比如指针p1,p2分别指向字符串string1,string2,如果string1大于string2,那么交换p1,p2的值,然后只需要输出交换后的p1,p2指向的字符串内容,就是排序后的结果。
谭浩强书上讲到个这个问题,应翻翻书认真体会。

程序如下,程序已在dev-c++和vs2005下运行通过。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void sort(char** p,int n)/* 冒泡排序,要想更快也可改用快速排序qsort */
{
char* temp;
int i,j;
for(i=0;i<n-1;i++) /* 注意这里是n-1不是n */
for(j=0;j<n-i-1;j++)
if(strcmp(p[j],p[j+1])>0) /* 由于p是二级指针,故这里p[j]还是一个指针 */
{
temp=p[j]; /* 交换的是指针指向的地址值,是一个16进制数值,不是交换字符串的内容 */
p[j]=p[j+1];
p[j+1]=temp;
}
}

int main()
{
int n,i;
char** p;
printf("Please input number n:");
while(1) /* 输入格式检测并输入数字n,输入格式错误提示重新输入 */
{
if(scanf("%d",&n)==1)
break;
fflush(stdin);
}
fflush(stdin); /* 清键盘缓冲区为下面gets()读入字符串做准备,因为gets()也是从缓冲区读入字符 */
p=(char** )malloc(n*sizeof(char*)); /* 建立二级指针即指向指针的指针并为它分配空间,它的成员是一级指针 */
printf("Please input %d strings:\n",n);
for(i=0;i<n;i++)
{
p[i]=(char* )malloc(256*sizeof(char)); /* 为二级指针指向的每个一级指针分配指向字符串的内存空间,这里设定每个字符串长度不超过256-1字节,可改动 */
gets(p[i]); /* 分配的每个字符串空间存放一个输入的字符串 */
}

sort(p,n); /* 冒泡排序,传递的是二级指针,故函数无需返回值 */
printf("The sequence after sort are:\n");
for(i=0;i<n;i++)
printf("%s\n",p[i]);

for(i=0;i<n;i++) /* 释放每个一级指针指向的内存空间 */
free(p[i]);
free(p); /* 释放二级指针指向的内存空间 */
p=NULL; /* 指针归零,这里这一句可以去掉 */

system("pause"); /* 按任一键退出 */
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-07-02
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 50

void select_sort(char **s,int n){
char *temp,ch1[N],ch2[N];
int i,j,min;
for(i=0;i<n-1;i++){
min=i;
for(j=i+1;j<n;j++){
strcpy(ch1,s[min]);
strcpy(ch2,s[j]);
strlwr(ch1);
strlwr(ch2);
if(strcmp(ch1,ch2)<0))min=j;
}
temp=s[i];
s[i]=s[min];
s[min]=temp;
}

int main(){
int n;
printf("Enter the value of n: ");
scanf("%d",&n);
int i;
char **s=(char **)calloc(n,sizeof(char *));
for(i=0;i<n;i++)
s[i]=(char *)calloc(N,sizeof(char));
printf("Enter n strings: ");
for(i=0;i<n;i++)
scanf("%s",s[i]);
sort(s,n);
for(i=0;i<n;i++)
printf("%s ",s[i]);
printf("\n");
for(i=0;i<n;i++)
free(s[i]);
free(s);
return 0;
}

可以处理长度小于50的字符串,字符大小写无所谓。
第2个回答  2009-07-02
看到下面都很多人回答了,来个有技术函量的吧。快排复杂度O(NlogN)
也不知道你能否看懂!但这个是排序中最快的,平均效率最高的。
#include<string.h>
int partition(char a[][27],int l,int r);
int quickSort(char a[][27],int l,int r);
int quickSort(char a[][27],int l,int r)
{
int j;
if(l<r)
{
j=partition(a,l,r);
quickSort(a,l,j-1);
quickSort(a,j+1,r);
}

return 0;
}
int partition(char a[][27],int l,int r)
{
int i,j;
char pivot[27],temp[27],name[27];
strcpy(pivot,a[l]);
i=l;j=r+1;
while (1)
{
do ++i;while(strcmp(a[i],pivot)<=0&&i<=r);
do --j;while(strcmp(a[j],pivot)>0);
if(i>=j) break;
strcpy(temp,a[i]);
strcpy(a[i],a[j]);
strcpy(a[j],temp);
}
strcpy(temp,a[l]); strcpy(a[l],a[j]); strcpy(a[j],temp);
return j;
}
第3个回答  2009-07-01
void sort(char *strings[],int n)
{
char *temp;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
if(strcmp(strings[i],strings[j])>0)
{
temp=strings[i];
strings[i]=strings[j];
strings[j]=temp;
}
}
void main()
{
char *strings[]={"aa","bb","abc","infant","lucky"};
sort(strings,5);
for(int i=0;i<5;i++)
printf("%s\n",strings[i]);
}

运用冒泡排序法比较AscII码
第4个回答  2009-07-01
什么叫对N个字符串按大小排列呀? 字符串怎么比大小???
可以设一个内位数据 进行存取 , 并进行1,2 ,比较,小的在存回去, 一次就可以啦,但是你说的是字符串 , 问题是这么问的吗?

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网