什么是冒泡排序?
将两个相邻的元素进行比较,如果前面的元素大(从小到大排序),就交换两个元素,重复这样往后依次操作,最终的结果是将一个数列按从大小或则从小到大的顺序排列;
冒泡排序的算法思想
1.先把第一个和第二个元素进行比较,如果大小顺序与目的顺序不同,就进行交换;
2.第一次比较后,把第二个和第三元素进行比较,如果与目的顺序不同,再进行交换;
3.重复上述操作,将这个数列遍历完一边后,最大或则最小的数(取决于你想排的顺序)就被放在了最后;
4.像这样,每遍历完一遍,就会将一个元素放在正确位置,所以我们遍历的次数等于所需要排列的元素个数减去一(即如果我们想要将10个数排序,就需要遍历9次);
算法图解
参考代码
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> void Print(int arr[],int n) { int i = 0; for (i = 0; i < n; i++) { printf("%d ",arr[i]); } } int main() { int arr[] = { 2,7,1,10,8,9,6,4,3,5 }; int len = sizeof(arr)/sizeof(arr[0]); int i = 0; int j = 0; for (i = 0; i < len-1; i++) { for (j = 0; j < len-i-1; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j +1]; //元素的交换 arr[j + 1] = tmp; } } Print(arr,len); //打印函数,打印排序过程 printf("\n"); } return 0; }
运行结果
代码优化
如果数列本是有序的,就不需要排序了。
优化代码
void Print(int arr[], int n) { int i = 0; for (i = 0; i < n; i++) { printf("%d ", arr[i]); } } int main() { int arr[] = {1,2,3,4,5,6,7,8,9 }; int len = sizeof(arr) / sizeof(arr[0]); int i = 0; int j = 0; int flag = 1; //标记 for (i = 0; i < len - 1; i++) { for (j = 0; j < len - i - 1; j++) { if (arr[j] > arr[j + 1]) { flag = 0; //如果一次遍历数组中有一次交换,说明数组无序 int tmp = arr[j]; //将flag赋值变为0;若有序则不变 arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } if (flag == 1) //若flag没改变,说明数组有序 { break; //跳出循环 } Print(arr, len); printf("\n"); } Print(arr,len); return 0; }
运行结果
(应为一次)