1.冒泡排序简介
冒泡排序(Bubble Sort),是一种较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
冒泡排序的核心思想是:相邻两个元素进行比较,如果不满足条件就交换,最后得到降序或升序。
2.直接上冒泡例子
废话不多说,直接上例子。
例如一组无序的数{11,8,26,57,34,45,22,19},让它排成升序,具体实现如下:
先上图
如图 1 所示是对无序表的第一次起泡排序,最终将无序表中的最大值 57 找到并存储在表的最后一个位置。具体实现过程为:
体实现过程为:
- 首先 11 和 8 比较,由于 11>8,所以两者交换位置,即从(1)到(2)的转变;
- 然后继续 11 和 26 进行比较,由于 11<26,所以不移动位置;
- (3)中 26 同 57 比较得知,两者也不需要移动位置;
- 直至(4),57 同 34 进行比较,57>34 ,两者交换位置,如(5)所示;
- 同样 57>45(5)、57>22(6)、57>19(7),所以经过一次冒泡排序,最终在无序表中找到一个最大值 57,第一次冒泡结束;
由于 57 已经判断为最大值,所以第二次冒泡排序时就需要找出除 57 之外的无序表中的最大值,比较过程和第一次完全相同。
经过第二次冒泡,最终找到了除 57 之外的又一个最大值 45,比较过程完全一样,这里不再描述。
通过一趟趟的比较,一个个的“最大值”被找到并移动到相应位置,直到检测到表中数据已经有序,或者比较次数等同于表中含有记录的个数,排序结束,这就是起泡排序。
3.冒泡排序代码如下(升序)
1.#include<stdio.h> int main() { int i, j, max; int arr[] = { 11, 8, 26, 57, 34, 45, 22, 19 }; int sz = sizeof(arr) / sizeof(arr[0]);//数组元素个数 for (i = 0; i < sz-1; i++)//趟数,一共 sz-1 趟 { for (j = 0; j < sz - i - 1; j++)//每一趟冒泡的过程 { if (arr[j] > arr[j + 1]) //交换两个值 { max = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = max; } } } printf("排序后的数组为:\n"); for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }
4.冒泡排序优化
1.冒泡排序优化
文章说到代码还可以继续优化,是什么原因呢?
我们观察发现当数组已经有序了(假设是升序),如{1,2,3,4,5,6,7,8},我们写的程序依旧继续进行下一轮的比较,直到所有的数进行比较、排序完,很明显后面的比较没有意义的这就会让这些代码的效率降低。
在这种情况下,我们就不必要对有序的数进行排序,以此减少代码执行的次数,提高代码的效率。
因此,我们可以设置一个 flags ,如果已经排好序了就令 flags==0 结束循环;如果不是有序的就令 flags==1 继续执行。
2.代码如下(优化后)
1.#include<stdio.h> int main() { int i, j, max; int flags; int arr[] = { 11, 8, 26, 57, 34, 45, 22, 19 }; int sz = sizeof(arr) / sizeof(arr[0]);//数组元素个数 for (i = 0; i < sz-1; i++)//趟数,一共 sz-1 趟 { flags = 0;// 每次开始冒泡前,初始化 flags 值为 0 for (j = 0; j < sz - i - 1; j++)//每一趟冒泡的过程 { if (arr[j] > arr[j + 1]) //交换两个值 { max = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = max; flags = 1;//不是有序,程序继续执行 } } if (flags == 0) { break;//有序,结束此次循环 } } printf("排序后的数组为:\n"); for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }
5.最最后
文章到这结束了,希望这篇文章能帮助到你!
感谢支持!!!