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

来源:百度知道 编辑:UC知道 时间:2024/06/03 08:00:57
设计一个函数,对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(&quo