提示:本文仅是对个人学习经历的一个记录
前言:
作为一个小白,关于我的学习经历,我想在此做一个记录。
本文关于用C语言实现冒泡排序。
PS:目前作者在学习C语言数组部分的内容,所以代码是基于C语言数组部分知识编写的。
一、什么是冒泡排序?
冒泡排序是交换排序中一种简单的排序方法。
基本思想:对所有相邻的元素进行比较,最终对所有元素进行正序或者逆序排列。
举个例子:有四个元素,初始排序是:12,8,13,9,对其进行从小到大排列
i = 0时, 注:上图坐标(i,j)
第一次12和8进行比较, 12比8大, 进行交换,变成坐标(0,0)数据,
第二次12和13进行比较,12不比13大,不用交换,变成坐标(0,1)数据,
第三次13和9进行比较, 13比9大, 进行交换,变成坐标(0,2)数据,得最大值13。
i = 1时 ,
第一次8和12进行比较, 8不比12大, 不用交换,变成坐标(1,0)数据,
第二次12和9进行比较, 12比9大, 进行交换,变成坐标(1,1)数据,得第二大值12。
i = 2时,
第一次8和9进行比较, 8不比9大, 不用交换,变成坐标(2,0)数据,得第三大值9和最小值8。
实现从小到大排列:8,9,12,13
二、实现步骤
这里写一段用冒泡法实现从大到小输出的程序。
1、代码如下:
#include <stdio.h>
/*
author: nopd
data: 2023.01.13
funDescription: bubble sort */
int main()
{
int i;
int j;
int tmp;
int array[] = {451,65,48,1,3,75};
int arraylen = sizeof(array)/sizeof(array[0]);
puts("原始数据:");
for(i=0;i<arraylen;i++){
printf("%d ",array[i]);
}
putchar('\n');
//冒泡排序
for(i=0;i<arraylen-1;i++){
for(j=0;j<arraylen-1-i;j++){
if( array[j]<array[j+1]){
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
}
}
}
puts("冒泡排序法输出(从大到小):");
for(i=0;i<arraylen;i++){
printf("%d ",array[i]);
}
puts("\ndone");
return 0;
}
2、运行结果:
要想实现从小到大只需要把 if 语句的结束条件改成如下:
if( array[j]>array[j+1])//把大数往后移
三、代码解析
1、初始化一个数组array
int array[] = {451,65,48,1,3,75};
2、sizeof关键字计算数组元素个数,定义一个整形变量arraylen用来存放数组元素的个数
int arraylen = sizeof(array)/sizeof(array[0]);
计算方法:用整个数组的大小除以数组内一个元素的大小得到数组元素个数
3、输出初始数组
4、进行冒泡排序
外层for循环控制轮数,一共进行了(arraylen-1)轮,
内层for循环控制两两比较,每轮只要比较(arraylen-1-i)次,
结合上面举得例子可以很容易理解。
PS:C语言数组下标访问从0开始,例子中4个数进行了三轮比较故i = 0,1,2
每轮两两比较了 4 - 1 - i 次
所以外层循环结束条件( i <arraylen-1),内层循环结束条件(arraylen-1-i)
5、输出排序后结果
总结:
以上就是今天要讲的内容,本文仅仅简单介绍了基于C语言中数组部分的知识实现冒泡排序。
对我而言,这是我的第一篇文章,如有错漏,望批评指正。让我们共同进步吧!!