冒泡排序是最简单的排序方法,理解起来容易。虽然它在这里插入代码片的计算步骤比较多,不是最快的,但它是最基本的,初学者一定要掌握 冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。
以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。 如果有N个数据,就要比较N-1轮,每轮比较 N-i次,i是轮数 j是每轮比较的次数
#include<stdio.h>
void BubbleSort(int* nums, int N)
{
for (int i = 1; i < N; i++)
{
for (int j = 0; j < N - i; j++)
{
if (nums[j] > nums[j + 1])
{
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
}
int main()
{
int arr[] = { 5,8,1,2,3,7,4};
BubbleSort(arr, 7);
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%d ", arr[i]);
}
}
举个例子
5,8,1,2,3,7,4
第一轮 i = 1<7 j=0<6 1) 5 和 8 进行比较,5 < 8 不交换位置
5,8,1,2,3,7,4
- 8 和 1 进行比较,8 > 1 交换位置
5,1,8,2,3,7,4
3)8 和 2 进行比较,8 > 2 交换位置
5,1,2,8,3,7,4
- 8 和 3 进行比较, 8 > 3 交换位置
5,1,2,3,8,7,4
5)8 和 7 进行比较, 8 > 7 交换位置
5,1,2,3,7,8,4
6)8 和 4 进行比较, 8 > 4 交换位置
5,1,2,3,7,4,8
其实冒泡排序每一轮会找一个最大的数,第一轮会找出最大的数放到末尾,第二轮会找到第二大的数放在末尾,以此类推。 第二轮 i = 2<7 j=0<5 1) 5 和 1 进行比较, 5 > 1 交换位置
1,5,2,3,7,4,8
2)5 和 2 进行比较, 5 > 2 交换位置
1,2,5,3,7,4,8
3)5 和 3 进行比较,5 > 3交换位置
1,2,3,5,7,4,8
- 5 和 7 进行比较, 5 < 7 不交换位置
1,2,3,5,7,4,8
- 7 和 4进行比较,7 > 4 交换位置
1,2,3,5,4,7,8
第三轮 i = 3<7 j=0<4 1) 1 和 2 比较, 1 < 2 不交换位置
1,2,3,5,4,7,8
2)2 和 3进行比较 , 2 < 3 不交换位置
1,2,3,5,4,7,8
- 3 和 5 进行比较,3 < 5 不交换位置
1,2,3,5,4,7,8
- 5 和 4进行比较 , 5 > 4 交换位置
1,2,3,4,5,7,8
此时序列已经是有序的了,但程序不知道,所以还要比较完剩下的轮数。 第四轮 i = 4<7 j=0<3 1) 1 和 2 比较, 1 < 2 不交换位置 2) 2 和 3 比较 , 2 < 3 不交换位置 3) 3 和 4 比较 ,3 < 4 不交换位置 第五轮 i = 5<7 j=0<2 1) 1 和 2 比较, 1 < 2 不交换位置 2) 2 和 3 比较 , 2 < 3 不交换位置 第六轮 i = 6<7 j=0<1 1) 1 和 2 比较, 1 < 2 不交换位置 到第六轮就比较完了,整个数组就是有序的了 冒泡排序有一个特点,这个程序是从大到小排序,所以第一轮排序以后,最小的数就会浮到最右面;第二轮排序以后,第二小的数会浮到倒数第二个位置;第三轮排序以后,第三小的数会浮到倒数第三个位置……也就是说,排序多少轮,就有多少个数字已经按排序要求排好了,它们不需要再比较。
冒泡排序优化版
这个数组比较到第四轮是时候已经是有序得了
5,8,1,2,3,7,4
第四轮
1,2,3,4,5,7,8
那后面的比较就是浪费时间了,所以我们加一个变量,先将变量初始化为0,当进行交换的时候赋值为1,因为进行了交换就说明当前数组还不是有序的,如果当轮数走完了,变量还是0,我们就退出循环,因为没有进行交换就说明整个数组是有序的。
#include<stdio.h>
void BubbleSort(int* nums, int N)
{
for (int i = 1; i < N; i++)
{
int isSort = 0;
for (int j = 0; j < N - i; j++)
{
if (nums[j] > nums[j + 1])
{
isSort = 1;
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
if (isSort == 0)
{
return;
}
}
}
int main()
{
int arr[] = { 5,8,1,2,3,7,4};
BubbleSort(arr, 7);
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%d ", arr[i]);
}
}
|