某个待排序的序列式一个可变长的字符串序列,这些字符串一个接一个地存储于单个字符数组中,采用快速排序方法对这个字符串序列进行排序,并编写一个对以下数据进行排序的程序。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
int start;
int length;
} Node;
char S[]={"whileifif-elsedo-whileforcase"}; //题目所要求的全局变量
Node A[]={{0,5},{5,2},{7,7},{14,8},{22,3},{25,4}}; //题目所要求的全局变量
int partition(char *Str[], int s,int t) //一趟划分,s大,i小
{
int i=s,j=t;
char* tmp=Str[i];
while(i<j)
{
while(i<j && strcmp(Str[j],tmp) > 0)
j--;
Str[i]=Str[j];
while(i<j && strcmp(Str[i],tmp) < 0)
i++;
Str[j]=Str[i];
}
Str[i]=tmp;
return i;
}
char **CreatStr(Node A[], char S[],int Alenth) //Alenth为A数组的数组长度
{
int i,j;
char **str,*string;
str=(char**)malloc(Alenth*sizeof(char*)); //长为lenth的指针数组。由于VC6不支持C99以上标准,无法用变量定义指针数组长
for(i=0;i<Alenth;i++)
{
string=(char*)malloc((A[i].length+1)*sizeof(char)); //分配字符串序列S中第i个字符串的空间长度,+1用来存放'\0'
for(j=0;j<A[i].length;j++) //逐个赋值
string[j]=S[A[i].start+j];
string[j]='\0'; //最后一个字符赋值'\0'
str[i]=string; //将string指针赋给指针数组元素str[i]
}
printf("排序前结果为:\n");
for(i=0;i<Alenth;i++) //输出
printf("%s\n",str[i]);
return str;
}
void QuickSort(char *Str[], int s,int t) //快速排序
{
int i;
if(s<t)
{
i=partition(Str,s,t);
QuickSort(Str,s,i-1);
QuickSort(Str,i+1,t);
}
}
int main ()
{
int Alenth=sizeof(A)/sizeof(A[0]); //获取A数组长度
char **s=CreatStr(A,S,Alenth);
QuickSort(s,0,Alenth-1); //A数组长度Alenth即字符指针数组s的长度,Alenth-1为str最末下标
printf("\n排序后结果为:\n");
for(int i=0;i<Alenth;i++)
printf("%s\n",s[i]);
return 0;
}