思想
相邻元素比较
若需要升序数列,则前一个数大于后一个数时交换
若需要降序数列,则前一个数小于后一个数时交换
实现
一轮冒泡排序
例如 将一段序列改为升序序列
第一个元素9和8比较 9>8 所以交换
交换后 9>7,交换
以此类推 我们就将该序列中最大的元素放在最后 这是一轮冒泡排序
一共需要几轮?
假设一个序列中有n个元素
我们发现每轮冒泡排序能将一个元素排序
理论上要将所有元素都排序需要n次
但是我们其实将n-1个元素排序号后 最后一个元素就已经是有序的了 所以只需要进行n-1次
所以需要一个循环来控制
for(i = 0; i < n - 1; i++)
{
;
}
循环内部交换
在循环内部 我们要实现元素的判断和交换
判断
判断的思路就和开头的思想一样
若需要升序数列,则前一个数大于后一个数时交换
若需要降序数列,则前一个数小于后一个数时交换
if (arr[j] > arr[j + 1])
{
int t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
利用if语句进行判断和交换;
那我们在一趟冒泡排序中需要进行几次判断和交换呢?
以十个元素为例
第一趟排序 两两元素之间判断需要 9次
第二趟排序 两两元素之间判断需要 8次
第三趟排序 两两元素之间判断需要 7次
…
最后一趟排序 两两元素之间判断需要 1次
我们发现每过一趟 判断次数就少一次
所以判断次数=n-1-i;
所以我们就可以写出冒泡排序的基本过程
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
int arr[10] = { 9,5,1,7,3,8,4,6,2,0 };
int i = 0, j = 0;
//冒泡排序
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
希望我的博客对你的学习有所帮助
IDE VS 2022