一、前期准备
冒泡排序的实质
冒泡排序大的实质也就是其核心思想就是相邻元素的两两比较。当然想要应用冒泡排序还是要有一些前期的准备的。
1、数组
数组就是有些相同数据类型的数据集合。这个概念可以类比数学中的集合来理解。
对于数组还需要知道数组传参的本质,数组传递参数实际上是传递数组首元素的地址,因此在函数内接收的时候,就需要用指针来接收。比如从主函数中传递来了一个数组,函数的接收就应该写成ElemType * 数组名来接受(ElemType 是指数组具体的类型,例如int char之类的),不过为了更容易理解c语言规定可以使用**ElemType 数组名[ ]**来用来接收数组,但是实际上还是和前者一样,只不过可以让使用者清楚的知道这就是个数组。具体的数组传参就先不赘诉。
2、数组长度
数组长度就是用操作符sizeof来测出来的
int n = sizeof(arr) / sizeof(arr[0]);
这行代码就可以测出数组arr的长度,第一个sizeof中使用的是arr这个数组名,它其实是整个数组的长度,这也是唯二使用arr时不是首元素的地址的情况。当然也是可以使用strlen这个函数直接来求数组长度的。
3、交换两个数的次序
这个我在之前的一篇文章中讲过,所以直接就放链接了。http://t.csdn.cn/Q6Fmm
二、冒泡排序
1、设计思路
利用冒泡排序的实质,相邻的两个数相比较较大的往后放这种设计思路,然后利用循环来依次实现排序。
2、代码实现(变成升序排序)
#include <stdio.h>
#define MaxSize 100
void Print(int arr[], int n);
void Bubbling(int arr[], int n);
void Bubbling(int arr[], int n)
{
int i = 0, j = 0;
for (i = 0; i < n; i++)
{
//这里的j < n - j - 1,是因为前面排过序的就不用再排了
for (j = 0; j < n - i - 1; j++)
{
if(arr[j] > arr[j + 1]{
int tem = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tem;
}
}
//为了更加清楚的显出来,这里每一次之后就都打印出来,以便于观察
printf("第%d次排序:\n", i+1);
Print(arr, n);
}
}
void Print(int arr[], int n)
{
for (int i = 0; i < n; i++)//顺序打印数组的元素
{
printf("%d ", arr[i]);
}
printf("\n");//全部打印之后换行
}
int main(void)
{
int arr[MaxSize] = { 0 };//数组初始化
int n = 0;//控制输入个数的变量
printf("请输入数字个数:\n");
scanf("%d", &n);
for (int i = 0; i < n; i++)//自行输入数组元素
{
scanf("%d", &arr[i]);
}
printf("原来的结果为:\n");
Print(arr, n);//传递参数给打印函数,打印未排序前的序列
Bubbling(arr, n);//调用排序数组,进行排序
printf("最后输出结果为:\n");
Print(arr, n);//再次调用打印函数,输出排序后的数组
return 0;
}
上图就是所运行的结果,过程清晰明了。
3、代码优化
上述情况具有特殊性,下面来看,一个随机的排序
这样的情况下,前面的排序就会显得十分多余。
那么下面将代码进行优化
//优化后
void Bubbling(int arr[], int n)
{
int i = 0, j = 0;
int flag = 1;//设置一个flag 变量来控制
//如果不需要交换,就直接跳过
for (i = 0; i < n; i++)
{
//这里的j < n - j - 1,是因为前面排过序的就不用再排了
flag = 1;//假设这一次已经有序了
for (j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j + 1]) {
flag = 0;//如果发生交换,就说明无序
int tem = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tem;
}
}
if (flag == 1) {
printf("\n");//换行与上面的结果区分开来
Print(arr, n);
break;
}
//这个else是可以不用写的,我这里写是为了更好的展示整个过程
else
{
printf("进行了调整\n");
Print(arr, n);
}
}
}
优化后的结果如下:
这样就实现了代码的优化。
个人拙见,如有更好的想法请不吝赐教。