排序算法--冒泡排序
##本小节知识点:
1. 【了解】冒泡排序
2. 【掌握】冒泡排序的步骤
3. 【了解】练习
---
##1.冒泡排序
- 冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它重复 地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来 是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
- 冒泡排序 分为: 大数下沉 小数上浮
---
##2.冒泡排序
- 1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应 该会是最大的数。
- 3)针对所有的元素重复以上的步骤,除了最后一个。
- 4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
- 示例:
---
##3.练习
- 输入一组无序数据,使用冒泡排序法进行排序,并输出。
```
1 // 冒泡排序 2 3 #include <stdio.h> 4 //交换算法 5 //打印输出数组的功能 6 void printArray(int array[],int length) 7 { 8 for (int i=0; i<length; i++) { 9 printf("%d ",array[i]); 10 } 11 printf("\n"); 12 } 13 14 //为了能够交换功能模块化,需要使用传地址来改变函数外的值 15 //要注意的是,参数需要传入地址值,也就是通过&获取变量的地址 16 void swop(int *a,int *b) 17 { 18 int temp = *a; 19 *a = *b; 20 *b = temp; 21 } 22 //沉底算法 23 void bubbleSort(int a[],int n) 24 { 25 for (int i=0; i<n-1; i++) { 26 for (int j = 0; j<n-i; j++) { 27 printf("替换前:"); 28 printArray(a, 5); 29 if (a[j]>a[j+1]) { 30 printf("开始替换\n"); 31 //两两比较,大的往后移 32 swop(&a[j], &a[j+1]); 33 printf("替换后:"); 34 printArray(a, 5); 35 printf("完成一次替换。\n"); 36 } 37 } 38 printf("完成一次遍历替换================\n"); 39 } 40 } 41 //冒泡算法 42 void bubbleSort2(int a[],int n) 43 { 44 for (int i=0; i<n-1; i++) { 45 for (int j = n-1; j>i; j--) { 46 if (a[j]<a[j-1]) { 47 swop(&a[j], &a[j-1]); 48 } 49 } 50 printf("完成一次遍历替换================\n"); 51 } 52 } 53 54 int main(int argc, const char * argv[]) { 55 56 int a[5] = {23,45,12,13,18}; 57 bubbleSort2(a,5); 58 printArray(a,5); 59 return 0; 60 }
备注:便于和数组首个下标索引是0,范围起始位置我表述为0。
算法思路:外循环,因为冒泡(小的数往前移动)或者沉底(大的数往后靠)的次数一定是n-1次,所以循环范围自然就是0~n-2<n-1.
内循环,比如沉底(大的数往后靠),比较的范围(0~n)-->.....-->(0~1),也就是说到最后一次沉底,就是第0个数和第1个数比较,然后大的往后移。
关于冒泡(小的数往前移),同理。