字符串快速排序

很久没写c语言代码了,回顾一下,写了基于快速排序的字符串排序。
c语言定义二维 数组的方式:
char s[10][20]; 正常的数组
char *s[20]; 指针数组,需要逐一申请空间,s[i] = malloc(…),s[i]指向的是一个地址

快速排序思想:
选择基准p,i<j,从左边找一个s[i]>p,从右边找一个s[j]<p,交换s[i],s[j];
基准与此时的s[i]交换;
此时,中间的值已经排好序,对两边进行递归快速排序,直到排序结束,即i>=j

#include<stdio.h>
#include<stdlib.h> 

//声明函数 
void qsort(char *lineptr[],int left,int right);
void swap(char *v[],int i,int j);
int strcmp(char *s,char *w);

int main()
{
//	int a[10][20]; //a[i][j] 20*row+col
//	int *b[10];	   //指针数组,b[i]指向一个地址,b[i] 要初始化
//	int size = 20;
//	
//	for(int i=0;i<10;i++){
//		int *p = (int*)malloc(sizeof(int)*size);
//		b[i] = p;
//	}
//	
//	for(int i=0;i<10;i++)
//		free(b[i]);
	//二维数组 
	char *s[] = {"Illegal month","Jan","Feb","Mar","Apil"}; //char s[][20] 
	for(int i=0;i<5;i++)
		printf("%s\n",s[i]);
	qsort(s,0,4);
	printf("排序后:\n");
	for(int i=0;i<5;i++)
		printf("%s\n",s[i]);
			
	return 0;
} 
 
void qsort(char *lineptr[],int left,int right){
	if(left>=right)
		return;
	int i = left+1;
	int j = right;
	
	char *p = lineptr[left];
	
	for(;i<j;){
		while(strcmp(lineptr[i],p)<=0 && i<j){
			i++;
		}
		while(strcmp(lineptr[j],p)>=0 && i<j){
			j--;
		}
		swap(lineptr,i,j);
	}
	swap(lineptr,left,i);
	qsort(lineptr,left,i-1);
	qsort(lineptr,i+1,right);

} 

int strcmp(char *s,char *w){
	for(;*s==*w; s++,w++){
		if(*s == '\0')
			return 0;
		}
	return *s -*w;
}

void swap(char *v[],int i,int j){
	char* temp = v[i];
	v[i] = v[j];
	v[j] = temp; 
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
快速排序是一种常用的排序算法,它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后再分别对这两部分记录继续进行排序,以达到整个序列有序的目的。对于C语言中的字符串快速排序,可以使用strcmp()函数来比较字符串的大小,具体实现方法如下: 1. 首先定义一个一维数组的指针,用来存储需要排序的字符串。 2. 定义一个quick()函数,传入的参数为字符串数组指针、开始下标和结束下标。 3. 在quick()函数中,设置基准数x为num[start],即第一个字符串。 4. 从右向左遍历数组,如果发现比基准数小的就把他放到基准数位置,然后i向后走一个;从左向右遍历数组,如果发现比基准数大的就把他放到上面空出来的j的位置,然后j向前走一个。 5. 当i==j时,把基准数放到此位置,就此实现了基准数左边比他小,基准数右边比他大的结果了。 6. 在i的左边再次调用quick()函数,在i的右端再次调用quick()函数。 7. 最后输出排序后的字符串数组。 下面是一个示例代码: ``` void quick(char *num[],int start, int finish)//传的是一维数组指针 { if(start<finish) { int i=start,j=finish; char *x=num[start];//x变成字符串 while(i<j) { while(i<j&&strcmp(num[j],x)>0)//比较字符串用strcmp()函数 j--; if(i<j) { num[i]=num[j]; i++; } while(i<j&&strcmp(num[i],x)<0)// i++; i++; if(i<j) { num[j]=num[i]; j--; } } num[i]=x; quick(num,start,i-1); quick(num,i+1,finish); } } int main() { char* str[8]={"CHINA","JAPAN","KOBEA","USA","RUSSIA","UK","FRANCE","AUS"};//设置个一维数组的指针 int i; printf("排序前:"); for(i=0;i<8;i++) printf("%s " ,str[i]);//字符串的出 putchar('\n'); quick(str,0,7);//调用,不要下标越位 printf("排序后;"); for(i=0;i<8;i++) printf("%s ",str[i]); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值