冒泡排序
冒泡排序:本质在于交换,每次通过交换的方式把当前剩余元素的最大值移动到一端,而当剩余元素减少为0时,排序结束。
算法原理
这是一个无序数列:1、5、4、2、6、3,我们要将它按从小到大排序。按照冒泡排序的思想,我们要把相邻的元素两两比较,根据大小来交换元素的位置
首先开始第一轮比较
第一步:比较1和5,1比5小,顺序正确,元素位置不变
第二步:比较5和4,5比4大,顺序错误,交换元素位置
第三步:比较5和2,5比2大,顺序错误,交换元素位置
经过一轮比较后,6作为最大的元素到了序列的最右侧
接下来进行第二轮比较,从1和4开始比较,到最右边的3结束,6已经是有序的,不需要再参与比较
第二轮结束后,如下所示
第三轮结束后,如下所示
第四轮结束后,如下所示
第五轮结束后,如下所示
至此所有的元素都是有序的
实现交换两个数
#include <stdio.h>
int main()
{
int a = 1, b = 2;
int temp = a;
a = b;
b = temp;
printf("a = %d, b = %d\n", a, b);
return 0;
}
//输出结果
a = 2, b = 1
实现冒泡排序
整个过程执行n-1趟,每趟从左到右比较相邻的两个数,如果大的数在左边,则交换,当该趟结束时,该趟最大数被移动到当前剩余的最右边。
#include <stdio.h>
int main()
{
int a[10] = {3, 1, 4, 5, 2};
for(int i = 1; i <= 4; i++) //进行n-1趟
{
//第i趟时从a[0]到a[n-i-1]都与它们下一个数比较
for(int j = 0; j < 5 - i; j++)
{
if(a[j] > a[j+1]) //如果左边的数更大,则交换a[j]和a[j+1]
{
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
for(int i = 0; i < 5; i++)
{
printf("%d ", a[i]);
}
return 0;
}
1 2 3 4 5