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

1. 冒泡排序简介(默认从小到大排序)

 核心思想:只比较相邻的两个元素,如果满足条件就交换

     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
  5 2 1 8 6 9 4 3 7 0
  5 2 1 6 8 9 4 3 7 0
  5 2 1 6 8 9 4 3 7 0
  5 2 1 6 8 4 9 3 7 0
  5 2 1 6 8 4 3 9 7 0
  5 2 1 6 8 4 3 7 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

2. 总共进行了 n-1次大的交换(n个元素   只有1个元素不需要排序)

  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++){
          交换 ...
    }
}
    

3. 实战 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;
}

原文地址:https://www.cnblogs.com/mofei1999/p/11780149.html

时间: 2024-10-08 12:38:28

c语言----- 冒泡排序 for while do-while 递归练习的相关文章

C语言中的预处理指令和递归

C语言中的预处理指令和递归 上个月就完成了黑马程序员的IOS基础视频教程,还记得刚开始学的时候,什么都不懂,现在学完基础感觉真的很不错! 每天都在期待着去黑马,憧憬着以后的生活.去黑马的路越来越接近了,我真的好兴奋!这些天一直在复习,感觉C语言中的预处理指令和递归都忘得差不多了. 预处理指令:是在编译器把代码编译成0跟1之前就会执行的一些指令.所有的预处理指令都是以#开头的. 预处理指令分为三种: 1.宏定义 用法--如:#define MYINT  int   表示把右边的int 在本代码以下

用C语言实现汉诺塔自动递归演示程序

用C语言实现汉诺塔自动递归演示程序 程序实现效果 1.变界面大小依照输入递归数改变. 2.汉诺塔自动移动演示. 3.采用gotoxy实现流畅刷新. 4.保留文字显示递归流程 程序展示及实现 github地址:https://github.com/404name/C-game 0.主体思路 输入要递归的汉诺塔数目,在原来的汉诺塔基础上新增move_play函数展示递归,用next数组存储每种移动状态.对应的从哪到哪可自动对应相应的移动方式自动移动. 1.变界面大小依照输入递归数改变 init函数按

C语言 冒泡排序 递归法

1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 6 void bubble(int *a,int n); 7 8 int i,n,a[100]; 9 10 printf("请输入数组中元素数量(不大于100个):"); 11 scanf("%d",&n); 12 13 for(;n<1||n>100;){ 14 printf("元素数量超

8.8 冒泡排序 选择排序 二分查找 递归使用

冒泡排序: #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 100000 #define M 100000 void show_arr(int * a,int n) { int i; for(i = 0; i < n; i++) { printf("%d ",a[i]); } printf("\n"); } void init_arr(in

15、【C语言基础】错误处理、递归

C 错误处理 C 语言不提供对错误处理的直接支持,但是作为一种系统编程语言,它以返回值的形式允许您访问底层数据.在发生错误时,大多数的 C 或 UNIX 函数调用返回 1 或 NULL,同时会设置一个错误代码 errno,该错误代码是全局变量,表示在函数调用期间发生了错误.您可以在 errno.h 头文件中找到各种各样的错误代码. 所以,C 程序员可以通过检查返回值,然后根据返回值决定采取哪种适当的动作.开发人员应该在程序初始化时,把 errno 设置为 0,这是一种良好的编程习惯.0 值表示程

sdut oj 1163 C语言实验——排列 (当初不会递归生成排列,这个题目现在才补上 刘汝佳给出了写法 *【模板】 当然有生成全排列的函数存在 )

C语言实验——排列 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 有4个互不相同的数字,请按序输出由其中三个不重复数字组成的排列. 输入 4个整数. 输出 所有排列,输出顺序见样例. 示例输入 1 2 3 4 示例输出 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 1 2 4 1 4 2 2 1 4 2 4 1 4 1 2 4 2 1 1 3 4 1 4 3 3 1 4 3 4 1 4 1 3 4

计算机导论语言与算法之程序与递归:组合-抽象-重复-构造

1.抽象计算对象与函数的定义与构造方法,程序是组合抽象构造出来的. 2.程序:由基本动作指令构造的,若干指令的一个组合或一个执行序列,用以实现复杂动作.程序执行机构节省了开发时底层的操作. 3.计算机系统的抽象过程.组合与构造层次.程序是构造出来的,而组合.抽象是构造程序的基本手段. 4.抽象与构造:命名计算对象.构造中使用名字.计算中以计算对象替换名字. 5.递归的定义:自身调用自身,高阶调用低阶,构造无限的计算步骤.由后向前带入,再由前向后计算. 6.原始递归函数

【C语言】reverse_string(char * string)(递归实现)

递归实现reverse_string(char * string)函数. 翻转 原来的字符串 是改变 不是打印出来. /* 编写一个函数reverse_string(char * string)(递归实现) 实现:将参数字符串中的字符反向排列. 要求:不能使用C函数库中的字符串操作函数. */ #include <STDIO.H> void reverse_string(char * string) { static char a[100]={0}; // 静态变量 记录字符串 static

C语言 冒泡排序

冒泡排序嵌套两个for循环,来个随机的数组 int num[]={1,56,23,12,58,45};    int n=sizeof(num)/sizeof(int);    int number;    for (int i=0;i<n;i++) {        for (int j=0;j<n-i-1;j++) {            if (num[j]>num[j+1]) {                number=num[j];                num[