2025年C语言——冒泡排序

C语言——冒泡排序目录 1 冒泡排序介绍 2 冒泡排序的算法步骤 3 举例说明 4 代码展示 5 例题变形 1 冒泡排序介绍 冒泡排序 Bubble Sort 是一种比较简单的直观算法 它从第一个数字开始重复地去访问 要排序的数列 一次比较两个相邻的数字

大家好,我是讯享网,很高兴认识大家。

目录

1.冒泡排序介绍

2.冒泡排序的算法步骤

3.举例说明

4.代码展示

5.例题变形


1.冒泡排序介绍

冒泡排序(Bubble Sort):是一种比较简单的直观算法,它从第一个数字开始重复地去访问

要排序的数列,一次比较两个相邻的数字,找出这两个数字之间的大小关系,并根据要求看是否要交换这两个数字。将数组里的所有数字比较过一次后,最后的一个数字一定是最大或最小的,那么再次进行比较的时候,所比较的次数就会减一次,直到没有再进行交换,那么该数列也就已经冒泡排序完成了。

2.冒泡排序的算法步骤

1、首先比较相邻的两个元素。如果当前的数字比第二个大,就将这两个数字交换。

2、比较下一个数字,对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,每次比较的数字是数组下标+1的数字,这步做完后,最后的元素一定是这些数字里面的最大值

3、针对所有的元素重复以上的步骤,每次所比较的数字除掉最后一个,比较的次数-1。

4、这样每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。


讯享网

3.举例说明

我们以1到9这九个数字随机排列为例,每次比较相邻的两个数字,那么第一次排序完成后,最后一个数字一定是最大的,也就是数字9;第二次排序则只需要比较前八个数字,排序完成后倒数第二个数字为8,以此类推,每次排序之后的最后一个数字一定是所比较的数字中的最大数,就这样一次次的比较,最后就会得到一个从小到大的数列。

4.代码展示

在这个代码中我使用flag,其作用就是如果在进行一定次数的排序之后,当前数组里的内容已经是有序的了,但是还是要继续进行比较,这无疑是浪费时间的,所以这个时候我还要你冒泡排序有何用,浪费时间与精力。所以此处的flag作用就是,如果将当前数组里的所有值都比较过一次而没有交换数值时,就说明这个数组里的值已经是有序的了,那么我们就可以直接结束for循环,返回输出数组里的内容。

/* 实现一个对整形数组的冒泡排序 */ #include <stdio.h> void Bubblsort(int arr[], int sz) { int i = 0; int count = 0; for (i = 0; i < sz - 1; i++)//因为每次都是当前数和下一数字比较,故一共有sz-1次 { int j = 0; int flag = 1; int tmp = 0; for (j = 0; j < sz -i - 1; j++)//当排完i次之后,总次数减去i,即sz -i - 1 { count++; if (arr[j] > arr[j + 1])//如果当前数大于下一个数 { tmp = arr[j];//交换数字 arr[j] = arr[j + 1]; arr[j + 1] = tmp; flag = 0;//flag赋值为0,说明剩余数组无序,进行了排序 } } //运行时这里要取消注释 //if (flag == 1)//当flag值不变是,说明没有排序,数组剩余为有序 //{ // break;//结束for循环 //} } printf("比较的次数为%d\n", count); } int main() { int arr[10]; int sz = sizeof(arr) / sizeof(arr[0]); printf("请输入你的数组:"); for (int i = 0; i < sz; i++) { scanf("%d", &arr[i]); } Bubblsort(arr, sz); printf("排序后的数组为:"); for (int i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }

讯享网

未使用flag的运行结果

使用flag的运行结果

17次对比45次,相差还不算大,但是当足够多的数字进行冒泡排序时,差值就会很大,所以这里对代码的一点小优化还是很可以的

5.例题变形

这里题目虽然变了,但是其本质依旧是冒泡排序的思想

讯享网/* 输入一个整数数组,实现一个函数, 来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分, 所有偶数位于数组的后半部分。 */ #include <stdio.h> void change(int arr[],int sz) { int i = 0; for (i = 0; i < sz - 1; i++)//因为每次都是当前数和下一数字比较,故一共有sz-1次 { int j = 0, flag = 1; int tmp = 0; for (j = 0; j < sz - i - 1; j++)//当排完i次之后,最后的i个数字一定是有序的最大数,故j < sz -i - 1 { if (arr[j]%2!=0 && arr[j + 1]%2==0)//如果当前数不是偶数,且下一个数是偶数 { tmp = arr[j];//交换数字 arr[j] = arr[j + 1]; arr[j + 1] = tmp; flag = 0;//flag赋值为0,说明剩余数组进行了排序 } } if (flag == 1)//当flag值不变是,说明没有排序 { break;//结束for循环 } } } int main() { int arr[10]; int sz = sizeof(arr) / sizeof(arr[0]); printf("请输入你的数组:"); for (int i = 0; i < sz; i++) { scanf("%d", &arr[i]); } change(arr, sz); printf("调整后的数组为:"); for (int i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }

以上就是今天的全部内容了,本篇文章只是简单的介绍了一下冒泡排序的算法与使用,如果想具体了解还是要上手去敲一敲代码哒,如有不足欢迎家人们评论区批评指正,如果这篇文章对你有用的话,可以给我来个一键三连嘛​​​​​​​

小讯
上一篇 2025-02-27 09:06
下一篇 2025-02-10 10:58

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/61396.html