数据结构:实现可变长字符串序列快速排序算法

某个待排序的序列式一个可变长的字符串序列,这些字符串一个接一个地存储于单个字符数组中,采用快速排序方法对这个字符串序列进行排序,并编写一个对以下数据进行排序的程序。

#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;
}


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值