目录
一、问题
二、冒泡排序的思想
三、举例
四、算法分析
五、代码实现
一、问题
现有一个整型数组(乱序),并且写一个函数(Sort)对数组进行排序,顺序要求升序。
二、冒泡排序的思想
两两相邻的元素进行比较,有可能需要交换(下面有图文说明能帮助大家理解)
对于升序,比较相邻的元素。如果第一个比第二个大,就交换。对每一对相邻元素作同样的工作,从开始第一对到结尾到最后一对。这一趟做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
三、举例
要求:升序
1)第一趟排序:
第一次排序:5和9比较,位置不变 5,9,3,6
第二次排序:9和3比较,位置交换,5,3,9,6
第三次排序:9和6比较,位置交换,5,3,6,9
总结:第一趟总共进行3次排序。
2)第二趟排序:
第一次排序:5和3比较,位置交换, 3,5,6,9
第二次排序:5和6比较,位置不变, 3,5,6,7
总结:第二趟总共进行2次排序。
3)第三趟排序 :
第一次排序:3和5比较,位置不变 3,5,6,7
到目前位置已经为有序的情形了。
总结:第二趟总共进行1次排序。
到目前位置已经为有序的情形了。
四、算法分析
N个数字要排序,总共进行N-1趟排序,每x趟的排序次数为(N-x)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数。
五、代码实现
#include <stdio.h>
void 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 tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main()
{
int i = 0; //不同函数内部可以取相同变量名
int arr[] = { 2,6,8,7,6,0,1,5,9,3 };
int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
Sort(arr,sz);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
程序结果: