IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【C语言】冒泡排序 -> 正文阅读

[数据结构与算法]【C语言】冒泡排序

冒泡排序是最简单的排序方法,理解起来容易。虽然它在这里插入代码片的计算步骤比较多,不是最快的,但它是最基本的,初学者一定要掌握
冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。

以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。
如果有N个数据,就要比较N-1轮,每轮比较 N-i次,i是轮数 j是每轮比较的次数

#include<stdio.h>
void BubbleSort(int* nums, int N)
{
    for (int i = 1; i < N; i++) //比较N轮
    {
        for (int j = 0; j < N - i; j++) //每轮比较 N-i轮
        {
            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++) //sizeof(arr) / sizeof(arr[0])是数组的长度
    {
        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
  1. 8 和 1 进行比较,8 > 1 交换位置
5,1,8,2,3,7,4

3)8 和 2 进行比较,8 > 2 交换位置

5,1,2,8,3,7,4
  1. 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
  1. 5 和 7 进行比较, 5 < 7 不交换位置
1,2,3,5,7,4,8
  1. 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
  1. 3 和 5 进行比较,3 < 5 不交换位置
1,2,3,5,4,7,8
  1. 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]);
	}
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 12:25:10  更:2022-10-31 12:29:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/11 7:06:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码