冒泡排序的思想就是通过相邻两个数据之间进行比较,将较大的数或者较小的数往后交换,每一轮冒泡选出最小或者最大的数交换到最后面并且不参与下一轮冒泡,这样通过不断的循环n-1(数据个数为n)轮冒泡,就完成了数据的有序排列。
首先我们假设有这样一个数组,里面存放着一些无序的数据:
int arr[] = { 2,5,6,45,8,65,42,20,9,54 };
首先通过sizeof求出数组长度除以一个数据单元所占长度,得到数组大小,如下:
int num = sizeof(arr) / sizeof(arr[0]);
通过冒泡排序的算法思想可以知道,我们需要两层循环,外循环控制每次冒泡次数,内循环进行比较相邻两个数据的大小和交换,代码实现如下(以升序为例):
void BubbleSort(int arr[], int num) { for (int i = 0; i < num - 1; i++) { int flag = 0; for (int j = 0 ; j < num - 1- i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; flag = 1; } } if (!flag) { break; } } }
其中,flag的作用:我们知道,在冒泡的过程中,有可能经过几次的冒泡排序后,数组内数据就已经提前达到有序的状态,那么我们可以通过设置一个标志变量flag来判断是否在冒泡排序的过程中提前达到有序状态,如果是则可以提前结束循环,这样可以有效的提高咱们算法的效率。
完整代码如下:
#include<stdio.h> void BubbleSort(int arr[], int num); void Show(int arr[], int num); int main() { int arr[] = { 2,5,6,45,8,65,42,20,9,54 }; int num = sizeof(arr) / sizeof(arr[0]); printf("排序前:"); Show(arr, num); BubbleSort(arr, num); printf("\n排序后:"); Show(arr, num); return 0; } void BubbleSort(int arr[], int num) { for (int i = 0; i < num - 1; i++) { int flag = 0; for (int j = 0; j < num - 1- i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; flag = 1; } } if (!flag) { break; } } } void Show(int arr[], int num) { for (int i = 0; i < num; i++) { printf("%d ", arr[i]); } }
效果展示: