数据结构与算法——十个排序算法之一 · 冒泡排序
冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。
1. 算法步骤
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
用以下数组进行举例:
171 | 161 | 163 | 165 | 167 | 169 |
第一次交换:
161 | 171 | 163 | 165 | 167 | 169 |
第二次交换:
161 | 163 | 171 | 165 | 167 | 169 |
第三次交换:
161 | 163 | 165 | 171 | 167 | 169 |
第四次交换:
161 | 163 | 165 | 167 | 171 | 169 |
第五次交换:
161 | 163 | 165 | 167 | 169 | 171 |
五次交换后获得了最终结果,当然并不是是每次都这么幸运,像下面的情况就会更复杂一些,一趟并不能完全解决问题, 我们需要多趟才能解决问题.
161 | 171 | 165 | 163 | 167 | 169 |
经过上边的5个步骤后得到的结果是:
161 | 165 | 163 | 167 | 169 | 171 |
此时,我们只保障了最后一个数是最大的, 并不能保障前面的数一定会有序,所以,我们继续按 照上面五步对剩下的 5 个数继续进行一次排序,数组就变得有序了
以上过程就是冒泡排序: 通过重复地遍历未排序的数列,一次比较两个元素,如果它们的顺 序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列 已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢得像泡泡一样“浮”到数 列的顶端,故而得名!
冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。
动图演示(来源 runoob.com):
代码实现:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void swap(int* num1, int* num2) //交换两个指针所指向得的元素的值 5 { 6 int temp = *num1; 7 *num1 = *num2; 8 *num2 = temp; 9 } 10 11 void BubbleSort(int arr[], int len) 12 { 13 for (int i = 0; i < len - 1; i++) 14 { 15 bool sorted = true; 16 for (int j = 0; j < len - 1 - i; j++) 17 { 18 if (arr[j] > arr[j + 1]) 19 { 20 swap(&arr[j], &arr[j + 1]); 21 sorted = false; 22 } 23 } 24 if (sorted) break; 25 } 26 } 27 28 int main(void) 29 { 30 int beauties[] = { 163, 161, 158, 165, 171, 170, 163, 159, 162 }; 31 int len = sizeof(beauties) / sizeof(beauties[0]); 32 BubbleSort(beauties, len); 33 printf("美女排序以后的结果是:\n"); 34 35 for (int i = 0; i < len; i++) 36 { 37 printf("%d ", beauties[i]); 38 } 39 40 system("pause"); 41 42 return 0; 43 }
===================================================================================================================