一、冒泡排序的含义
冒泡排序(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