设计一个函数,对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;}
#include <stdio.h>#include <stdlib.h>#include <string.h>#define N 50void 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的字符串,字符大小写无所谓。
看到下面都很多人回答了,来个有技术函量的吧。快排复杂度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;}
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码