//实现可变长度的字符串序列快速排序算法
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MaxL 50 //最大的字符串长度
typedef struct node //记录类型
{
int start;//串的起始位置
int length;
}RecType;
int StringComp(char s[],RecType a[],int s1,RecType temp)
{
char str1[MaxL],str2[MaxL];
int i,j;
for(j=0,i=a[s1].start;i<a[s1].start+a[s1].length;i++,j++)
str1[j]=s[i];//将第s1个字符串复制到Str1中
str1[j]='\0';//字符串末尾置'\0'
for(j=0,i=temp.start;i<temp.start+temp.length;i++,j++)
str2[j]=s[i];//将temp所指的字符串复制到Str2中
str2[j]='\0';
return strcmp(str1,str2);//调用标准字符串比较函数返回结果
}
void QuickSort(char s[],RecType a[],int low,int high)
{
int i,j;
RecType temp;
i=low;
j=high;
if(low<high)
{
temp=a[low];
while(i!=j)
{
while(j>i && StringComp(s,a,j,temp)>0) j--;
if(i<j)
{
a[i]=a[j];
i++;
}
while(i<j && StringComp(s,a,i,temp)<0) i++;
if(i<j)
{
a[j]=a[i];
j--;
}
}
a[i]=temp;
QuickSort(s,a,low,i-1);
QuickSort(s,a,i+1,high);
}
}
int main()
{
int i,j,n=6;
char s[]={"whileifif-elsedo-whileforcase"};
RecType a[]={{0,5},{5,2},{7,7},{14,8},{22,3},{25,4}};
printf("排序前的字符串:\n");
for(i=0;i<n;i++)
{
printf(" ");
for(j=a[i].start;j<a[i].start+a[i].length;j++)
printf("%c",s[j]);
printf("\n");
}
printf("\n");
QuickSort(s,a,0,n-1);
printf("排序后的字符串:\n");
for(i=0;i<n;i++)
{
printf(" ");
for(j=a[i].start;j<a[i].start+a[i].length;j++)
printf("%c",s[j]);
printf("\n");
}
return 0;
}
数据结构源码笔记(C语言描述)汇总: