【统计字符——改进】加入冒泡排序使结果更美观

一、冒泡排序的含义

        冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

二、冒泡排序的思想总结

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

        总的来说,如果有N个数需要排序,则必须经过N-1轮才能完成排序,其中在第M轮比较过程中包含N-M次的两两数比较和交换过程。

三、冒泡思想的实现

	/*冒泡排序*/
    for (int i = 1; i < N; i++) {/*外层循环控制比较的轮数,N-1*/
		for (int j = 0; j < N - i; j++) {/*内层循环控制每一轮比较的次数,N-i*/
			if (*(p + j) < *(p + j + 1)) {/*前后两数交换需满足的条件*/
				int temp = *(p + j); *(p + j) = *(p + j + 1); *(p + j + 1) = temp;
			}
		}
	}

        将该种思想直接搬运到数组中即可实现统计后的表达美观易读!

四、应用示例

	for (int a = 1; a < kindnum; a++) {//冒泡排序:kindnum个字符种类,需kindnum-1个轮回
		for (int b = 0; b < kindnum - a; b++) {//第a轮包含kindnum-a次两两比较
			if (*(pa + b) > *(pa + b + 1)) {
				char tempa = *(pa + b); *(pa + b) = *(pa + b + 1); *(pa + b + 1) = tempa;
				int tempb = *(pb + b); *(pb + b) = *(pb + b + 1); *(pb + b + 1) = tempb;
			}
		}
	}

        最后将此段代码放到上一篇文章中的states函数中即可,如下:

(与之前有所不同的是,我使用getchar()函数替代了gets_s()函数,我个人认为这样比较方便,不会有输出'\0'的影响)

#include <stdio.h>
#define N 10

char kind[N];
int num[N];//能力有限不知如何处理有两个返还值的函数,故用全局变量以在main函数中加以使用
int kindnum = 1;//kindnum变量的作用为计数当前不同(种类)字符的个数
void stats(char a[N]) {//定义stats函数
	int i = 0, j = 0;//i为输入的字符数组下标,j为kind数组中的下标
	int chongfu = 0;//判断当前字符是否重复的标记
	kind[0] = a[0]; num[0] = 1; //默认输入字符有至少一个,且把第一个字符纳入kind数组中,并把该字符计数赋一
	for (i = 1; i <= N - 1; i++) {//循环提取输入字符
		for (j = 0; j <= kindnum - 1; j++) {//循环判断kindnum次
			if (kind[j] == a[i]) {//判断提取的输入字符与kind数组是否有重复
				num[j] = num[j] + 1;//将判断成功的kind数字对应的计数加一
				chongfu = 1;//将重复的标记赋值为1
				break;//判断为有重复,跳出循环
			}
			chongfu = 0;//仍未重复,标记为0
		}
		if (chongfu == 0) {//重复标记为0则在kind数组中加一个新的字符种类
			kind[kindnum] = a[i]; num[kindnum] = 1; kindnum++;//对新种类的字符纳入并计数加一
		}
	}

	/*使用指针进行冒泡排序*/
	char* pa = kind; int* pb = num;
	for (int a = 1; a < kindnum; a++) {//冒泡排序:kindnum个字符种类,需kindnum-1个轮回
		for (int b = 0; b < kindnum - a; b++) {//第a轮包含kindnum-a次两两比较
			if (*(pa + b) > *(pa + b + 1)) {
				char tempa = *(pa + b); *(pa + b) = *(pa + b + 1); *(pa + b + 1) = tempa;
				int tempb = *(pb + b); *(pb + b) = *(pb + b + 1); *(pb + b + 1) = tempb;
			}
		}
	}
}

void main() {
	char a[N];
	int i = 0, j = 0;
	printf_s("请输入%d个字符:\n",N);
	for (int x = 0; x <= N - 1; x++) {
		a[x] = getchar();
	}
	stats(a);//调用stats函数,使全局变量kind[]和num[]发生改变
	for (i = 0, j = 0; i <= kindnum - 1 && j <= kindnum - 1; i++, j++) {
		printf_s("%c:%d", kind[i], num[j]);
		printf_s("\n");
	}
}

        最终的调试结果如下图:


本文参考:
1.1 冒泡排序 | 菜鸟教程 (runoob.com)https://www.runoob.com/w3cnote/bubble-sort.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值