算法是程序的靈魂。
三樓好嗎?如果有1000個字符串,排序是不是要復制很多次?此外,字符串的長度可能不壹致。復制不同長度的字符串合理嗎?雖然規定了每個字符串不能超過50個字節,但在算法上是不合理的。如果有10000個字符,有100000個字符,那麽通過這種復制方式,我們從哪裏可以找到效率呢?
我們做什麽呢根本不需要交換字符串的內容,只需要交換指向字符串的地址。因為字符串的地址是16的十六進制數,所以只交換壹個值比復制整個字符串要高效得多。例如,指針p1和p2分別指向字符串string1和string2。如果String1大於String2,那麽P1和P2的值進行交換,然後只需要輸出交換後的P1和P2指向的字符串內容,就是排序後的結果。
譚浩強的書談到了這個問題,所以我們應該仔細閱讀這本書並理解它。
程序如下,已經在dev-c++和vs2005下運行。
# include & ltstdio.h & gt
# include & ltstdlib.h & gt
# include & ltstring.h & gt
Void sort(char** p,int n)/* bubble sort,如果想排序更快,也可以使用快速排序qsort */
{
char * temp
int i,j;
for(I = 0;我& ltn-1;I++) /*註意這是n-1,不是n */
for(j = 0;j & ltn-I-1;j++)
if(strcmp(p[j],p[j+1])& gt;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("請輸入數字n:");
當(1) /*輸入格式檢測並輸入數字n時,輸入格式錯誤提示重新輸入*/
{
if(scanf("%d ",& ampn)==1)
打破;
fflush(stdin);
}
fflush(stdin);/*清空鍵盤緩沖區,為getting()讀取下面的字符串做準備,因為getting()也會從緩沖區讀取字符*/
p =(char * *)malloc(n * sizeof(char *));/*建立壹個二級指針,即指向壹個指針的指針,並為其分配空間。其成員是主指針*/
printf("請輸入%d個字符串:\n ",n);
for(I = 0;我& ltn;i++)
{
p[I]=(char *)malloc(256 * sizeof(char));/*為每個二級指針指向的壹級指針分配指向字符串的內存空間。這裏,每個字符串的長度設置為不超過256-1字節,可以更改*/
gets(p[I]);/*每個分配的字符串空間保存壹個輸入字符串*/
}
sort(p,n);/*冒泡排序,傳遞壹個二級指針,所以函數不需要返回值*/
printf("排序後的順序是:\ n ");
for(I = 0;我& ltn;i++)
printf("%s\n ",p[I]);
for(I = 0;我& ltn;I++) /*釋放每個壹級指針指向的內存空間*/
自由(p[I]);
免費(p);/*釋放二級指針指向的內存空間*/
p = NULL/*指針歸零,這裏這句話可以去掉*/
系統(“暫停”);/*按任意鍵退出*/
返回0;
}