c语言----- 冒泡排序 for while do-while 递归练习

mac2026-09-30  3

c语言----- 冒泡排序 for while do-while 递归练习

核心思想(默认从小到大排序)冒泡排序实例规律实战 for while do-while 递归

冒泡排序是数据结构与算法的基础知识,每一个程序员都应该认真掌握冒泡排序的核心思想,以及对应的 for while do-while 递归形式。

核心思想(默认从小到大排序)

只比较相邻的两个元素,如果满足条件就交换n个元素最多交换n-1次(只有一个元素不需要交换)每一趟排序完都能找到一个最大值or最小值

例如 3 2 1 第一趟: 第一次: 3 > 2 交换 交换后:2 3 1 第二次: 2 >1 交换 交换后: 2 1 3 第二趟: 第一次: 2 > 1交换 交换后: 1 2 3

冒泡排序实例

源数据:5 8 2 1 6 9 4 3 7 0 排序后:0 1 2 3 4 5 6 7 8 9 5 < 8 不交换 5 8 2 1 6 9 4 3 7 0 8 > 2 交换… 5 2 8 1 6 9 4 3 7 0 8 > 1 交换… 5 2 1 8 6 9 4 3 7 0 8 > 6 交换… 5 2 1 6 8 9 4 3 7 0 8 < 9 不交换 5 2 1 6 8 9 4 3 7 0 9 > 4 交换… 5 2 1 6 8 4 9 3 7 0 9 > 3 交换… 5 2 1 6 8 4 3 9 7 0 9 > 7 交换… 5 2 1 6 8 4 3 7 9 0 9 > 0 交换… 5 2 1 6 8 4 3 7 0 9 下一次交换   2 5 1 6 8 4 3 7 0 9   2 1 5 6 8 4 3 7 0 9   2 1 5 6 8 4 3 7 0 9   2 1 5 6 8 4 3 7 0 9   2 1 5 6 4 8 3 7 0 9   2 1 5 6 4 3 8 7 0 9   2 1 5 6 4 3 7 8 0 9   2 1 5 6 4 3 7 0 8 9

下一次交换   1 2 5 6 4 3 7 0 8 9   1 2 5 6 4 3 7 0 8 9   1 2 5 6 4 3 7 0 8 9   1 2 5 4 6 3 7 0 8 9   1 2 5 4 3 6 7 0 8 9   1 2 5 4 3 6 7 0 8 9   1 2 5 4 3 6 0 7 8 9

下一次交换   1 2 5 4 3 6 0 7 8 9   1 2 5 4 3 6 0 7 8 9   1 2 4 5 3 6 0 7 8 9   1 2 4 3 5 6 0 7 8 9   1 2 4 3 5 6 0 7 8 9   1 2 4 3 5 0 6 7 8 9

下一次交换   1 2 4 3 5 0 6 7 8 9   1 2 4 3 5 0 6 7 8 9   1 2 3 4 5 0 6 7 8 9   1 2 3 4 5 0 6 7 8 9   1 2 3 4 0 5 6 7 8 9

下一次交换   1 2 3 4 0 5 6 7 8 9   1 2 3 4 0 5 6 7 8 9   1 2 3 4 0 5 6 7 8 9   1 2 3 0 4 5 6 7 8 9

下一次交换   1 2 3 0 4 5 6 7 8 9   1 2 3 0 4 5 6 7 8 9   1 2 0 3 4 5 6 7 8 9

下一次交换   1 2 0 3 4 5 6 7 8 9   1 0 2 3 4 5 6 7 8 9

下一次交换   0 1 2 3 4 5 6 7 8 9

规律

5 2 1 6 8 4 3 7 0 9 //这次交换 一共变化了9次   2 1 5 6 4 3 7 0 8 9 // 8次   1 2 5 4 3 6 0 7 8 9   1 2 4 3 5 0 6 7 8 9   1 2 3 4 0 5 6 7 8 9   1 2 3 0 4 5 6 7 8 9   1 2 0 3 4 5 6 7 8 9   1 0 2 3 4 5 6 7 8 9   0 1 2 3 4 5 6 7 8 9   每一次小交换是9 8 7 6 5 4 3 2 1 次交换,也就是说

for(int i = 0;i < N-1;i++){   for(int j = 0;j < N-1-i;i++){ 交换 ... } }

实战 for while do-while 递归

#include<stdio.h> #include<stdlib.h> #define N 10 void print(int *a){ for (int i = 0; i < N; i++) { printf("%d ",*(a+i)); } printf("\n"); } void maopao_for(int *a){ for (int i = 0; i < N - 1; i++) { for (int j = 0; j < N - 1 - i; j++) { if (a[j] > a[j + 1]) { int temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } print(a); } } void maopao_while(int *a) { int i = 0; while (i < N - 1) { int j = 0; while (j < N - 1 - i) { if (a[j] > a[j + 1]) { int temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } j++; } print(a); i++; } } void maopao_do_while(int *a) { int i = 0; do{ int j = 0; do{ if (a[j] > a[j + 1]) { int temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } j++; } while (j < N - 1 - i); print(a); i++; } while (i < N - 1); } // 递归可以减少一次循环 void maopao_digui(int *a,int count) { if(count>=N) return ; for (int j = 0; j < N - 1 - count; j++) { if (a[j] > a[j + 1]) { int temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } }//printf("下一次交换\n\n\n"); print(a); maopao_digui(a,count+1); } int main(){ int a[N] = {5,8,2,1,6,9,4,3,7,0}; printf("排序前:\n"); print(a); printf("排序中:\n"); maopao_digui(a,0); printf("排序后:\n"); print(a); return 0; }
最新回复(0)