目录
前言
对初学者来说,冒泡排序是很难理解的一个点,那么希望这篇文章可以对你理解冒泡排序有所帮助
经典冒泡排序
题目:给定一串数字,进行由大到小的排序
算法:令数组中的前两个数字进行大小比较,看作为左右两个数,进行大小比较后使得数字较大的数字始终在右边的位置,下一轮比较时再让这个数字和右边的数字继续比较,依次比较直到这串数组的最后一个字符,这样我们就能通过这一操作让这串字符串中最大的一个数字放到字符串的最后一个位置,这样就完成了一趟,其余数字依次进行即可
以下为完整代码:
#include <stdio.h> void bubble_sort(int arr[], int sz) { int temp = 0; int i, j; for (i = 0; i < sz - 1; i++) { for (j = 0; j < sz - 1 - i; j++) if (arr[j] > arr[j + 1]) { temp = arr[j+1]; arr[j + 1] = arr[j]; arr[j] = temp; } } } int main() { int arr[] = {10,9,8,7,6,5,4,3,2,1}; int sz = sizeof(arr) / sizeof(arr[0]); int i = 0; bubble_sort(arr, sz); //数组传参只会传首地址,即&arr[0],所以要提前传递sz for (i = 0; i < sz; i++) printf("%d ", arr[i]); printf("\n"); return 0; }
在实际比较中会遇见这样的情况,如果给定的数组是9 1 2 3 4 5 6 7 8,那么实际上我们只需要进行一次循环就已经排序完成了,若运行上述程序还会接着进行循环,直到最后一个数字被比较
我们可以对程序略加优化:我们可以引入一个flag的变量,当左边的数字大于右边时会进入循环,此时flag会变成0,当结束这一趟循环时flag又会被赋为1,若接下来的数字没有进入if循环,则说明已经不再需要后续比较了,此时flag仍为1,那么我们就可以直接break跳出循环,这样可以作为一个优化
冒泡排序的优化:
以下为优化后的结果:
int main() { int a[10], i, j, n; printf("输入10个数:"); for (i = 1; i <= 10; i++) scanf("%d", &a[i]); for (i = 1; i <= 10; i++) for (j = i; j <= 10; j++) { if (a[i] > a[j]) { n = a[i]; a[i] = a[j]; a[j] = n; } } printf("该十个数升序为: "); for (i = 1; i <= 10; i++) printf("%2d", a[i]); } #include <stdio.h> void bubble_sort(int arr[], int sz) { int temp = 0; int i, j; for (i = 0; i < sz - 1; i++) { int flag = 1; for (j = 0; j < sz - 1 - i; j++) if (arr[j] > arr[j + 1]) { temp = arr[j+1]; arr[j + 1] = arr[j]; arr[j] = temp; flag = 0; } if (flag == 1)//对代码进行优化,如果已经达到顺序则不再进行排序 break; } } int main() { int arr[] = {10,9,8,7,6,5,4,3,2,1}; int sz = sizeof(arr) / sizeof(arr[0]); int i = 0; bubble_sort(arr, sz); //数组传参只会传首地址,即&arr[0],所以要提前传递sz for (i = 0; i < sz; i++) printf("%d ", arr[i]); printf("\n"); return 0; }