C Primer Plus—字符串排序(选择排序与冒泡排序)(C语言)

题目要求:输入的字符串按首字符大小排序
今天看到了字符串排序的部分,书上讲的是选择排序算法的做法,但我想起之前学过的冒泡排序,发现也可以做,两种做法都放上来。代码如下。
选择排序:

#include<stdio.h>
#include<string.h>
#define SIZE 81
#define LIM 20
int main()
{
	char input[LIM][SIZE];
	char *ptstr[LIM];         //注意:是指针(代码块下方会有说明理由)
	int ct = 0;       //字符串组数
	int k;
	void stsrt(char *strings[],int num);    //声明编写的字符串排序函数
	char *s_gets(char *st,int n);   //声明修改后的输入函数
	
	while(ct < LIM && s_gets(input[ct],SIZE) != NULL && input[ct][0] != '\0')
	//while条件是数组下标不可超界,且输入不能是EOF,不能是空行
	{
		
		ptstr[ct] = input[ct];       //将输入的各字符串赋给指针变量
		ct++;
	}
	stsrt(ptstr,ct);    //调用字符串排序函数
	for(k = 0;k < ct;k++)
	{
		puts(ptstr[k]);   //输出排序后结果
	}
	return 0;
} 
void stsrt(char *strings[],int num)     //字符串排序函数 
{
	int top,seek;
	char *temp;
	for(top = 0;top < num - 1;top++)  
	//选择排序算法:此处实际上就是利用嵌套循环将首字符从小到大的字符串顺位排列
	{
		for(seek = top + 1;seek < num;seek++) 
		{
			if(strcmp(strings[top],strings[seek]) > 0)  
			 //若第一个参数ASCII码在第二个后面则返回正值,说明大的往后放
			{
				temp = strings[top];
				strings[top] = strings[seek];
				strings[seek] = temp;
			}
		}
	}
}
char *s_gets(char *st,int n)           //修改fgets后的输入函数
{
	char *ret_val;
	int i = 0;
	ret_val = fgets(st,n,stdin);
	if(ret_val)
	{
	 	while(st[i] != '\n' && st[i] != '\0')
	 		i++;
	 	if(st[i] == '\n')
	 		st[i] ='\0';
	 	else
	 	{
	 		while(getchar() != '\n')
	 			continue;
		 }
	}
	return ret_val;
}

值得注意的除了选择排序算法外,还有ptstr这个指针变量。可以发现,是将指针变量传入函数进行排序,而不是直接将字符串本身传入排序。输入的字符串赋给指针变量,如ptstr[0] = input[0],即ptstr[0]指向input[0]的首字符,ptstr依次传入函数进行选择排序,排序过程是重新排列ptstr,而没有改变input,如ptstr[0]从指向input[0]变为指向input[3]。

冒泡排序

#include<stdio.h>
#include<string.h>
#define SIZE 81
#define LIM 20
int main()
{
	char input[LIM][SIZE];
	char *ptstr[LIM];
	int ct = 0;
	int k;
	void stsrt(char *strings[],int num);       //此处这个改为冒泡排序的函数了
	char *s_gets(char *st,int n);
	
	while(ct < LIM && s_gets(input[ct],SIZE) != NULL && input[ct][0] != '\0')
	{
		
		ptstr[ct] = input[ct];
		ct++;
	}
	stsrt(ptstr,ct);
	for(k = 0;k < ct;k++)
	{
		puts(ptstr[k]);
	}
	return 0;
} 
void stsrt(char *strings[],int num)
{
	int top,seek;
	char *temp;
	for(top = 0;top < num - 1;top++)          
	//可以看到,原本的选择排序,稍加改动成经典的冒泡排序亦可以做
	{
		for(seek = 0;seek < num - 1 - top;seek++) 
		{
			if(strcmp(strings[seek],strings[seek+1]) > 0) 
			  //这里要注意 是seek和seek+1比较,因为冒泡排序是相邻项比较
			{ 
				temp = strings[seek];
				strings[seek] = strings[seek+1];
				strings[seek+1] = temp;
			}
		}
	}
}
char *s_gets(char *st,int n)
{
	char *ret_val;
	int i = 0;
	ret_val = fgets(st,n,stdin);
	if(ret_val)
	{
	 	while(st[i] != '\n' && st[i] != '\0')
	 		i++;
	 	if(st[i] == '\n')
	 		st[i] ='\0';
	 	else
	 	{
	 		while(getchar() != '\n')
	 			continue;
		 }
	}
	return ret_val;
}

以上就是两种方法的字符串排序。
欢迎交流探讨。
谢谢。

猜你喜欢

转载自blog.csdn.net/weixin_44009743/article/details/84925512