一.问题分析
冒泡排序是一种直观的排序算法,重复走过要排序的数列,一次比较两个元素,如果顺序不对,就把他们交换过来,一直重复这个过程直到排序完成。
例如这个数组如果我们想要用冒泡排序完成升序排列,那么他的过程是怎么样的呢
首先当然是第一个元素2与它相邻的9进行比较,发现2<9,符合升序要求,再与9相邻的4进行比较,仍然满足升序,直到和1比较后,不满足升序,则此时2与1互换位置则此时数列变为
我们将这个过程为一趟冒泡排序
然后进行进一步比较,从9开始与它相邻的元素比较,重复1的操作,我i们发现9首先和4互换位置,再和7互换位置,再与5互换位置,再与8互换位置。最后与2互换位置。此时数列变为
此时我们对于9和2的排序完成了,后面的5个元素的操作同上,最终就完成了整个数组的排序。
二.解题思路
对于这个代码的编写,我们从宏观上先去思考一下,完成整个数组的排序需要多少趟排序呢,不难看出若数组中共K个元素则需要k-1次冒泡排序。那我们完全可以用一个for循环解决这个过程,
int i=0;
scanf("%d",&i);
int k=0;
for (k=0;k<i-1;k++)
{
//里面是程序进一步过程
}
我们以经完成了数组中所有元素的冒泡排序时的趟数,那么一个元素再排列时具体又是怎么样的呢
,我们假设m是数列中间的一个元素,那么此时他的前面一定是比它小的元素顺序已经排好,它只需要和它后面的k-m个元素进行排列就好了。从这个例子看,每一个元素排列时总是与他们之前的元素个数,及数组的元素个数有关,所以我们首先想到嵌套一个for循环,来解决这个问题
int i=0;
scanf("%d",&i);
int k=0;
for (k=0;k<i-1;k++)
{
int j=0;
for(j=0;j<i-1-k,j++)
{
//条件判断
}
}
那么就剩下如果不满足升序的条件时元素的交换了,这个很简单,一个if条件判段,创建一个第三变量来交换元素
if(arr[j]>arr[j+1])
{
int tem=arr[j];
arrf[j]=arr[j+1];
arr[j+1]=tem;
}
ok,那么我们就完成了整个冒泡排序的过程。
三.代码实现
运行截图:
代码源码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void bubble_sort(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz-1; i++)
{
int j = 0;
for (j=0;j<sz-1-i;j++)
{
if (arr[j] > arr[j + 1])
{
int tem = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tem;
}
}
}
}
void print_arr(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = {1,4,7,5,8,9,2};
int sz = sizeof(arr) / sizeof(arr[0]);//计算了整个数组的元素的个数
bubble_sort(arr, sz);//冒泡排序的函数
print_arr(arr, sz);//打印数组元素
return 0;
}
完成排序!!!
四.总结与思考
冒泡排序是最简单的算法之一,再我们要对一个数列中的元素进行排列的时候,非常有用,对于初学者来说是一种必须掌握的技能,再熟悉了整个过程之后,可以思考一下,这个代码有没有可以优化的地方呢?对了如果序列以经有序,再进行排序则没有意义,此时我们可有创建一个变量flag,再一趟冒泡排序之后,如果flag没有发生改变,则证明数列已经有序,直接break跳出循环即可。
但是冒泡排序还是有一些弊端的,比如它无法对进行不同数据类型的数进行排列。