排序算法_冒泡排序(算法设计与C代码实现)

Posted Lanyan9

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法_冒泡排序(算法设计与C代码实现)相关的知识,希望对你有一定的参考价值。

# 冒泡排序算法
冒泡排序算法是排序算法中很有意思的一种排序方式,其主要思想是:
每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。

目录

一、问题描述

       将一个数组中的数字进行排序处理,并返回一个排好序的新数组。

二、问题分析

算法:排序算法_冒泡排序
步骤:
(1)要进行几轮冒泡?
这个问题很多人觉得很烧脑,其实要进行几轮冒泡很好确定,比如,对5个数进行排序,只需要4轮就可以,你可以想象共有5个位置,当4个数已经确定位置后,那么剩下的数自然就找好了位置。

(2)每轮冒泡要进行几次交换?
这个地方我们可以用从特殊到一般的方法来研究这个算法。
怎么才算特殊?5,4,3,2,1就很特殊,我们下边讨论如何将它从小到大排序:

第1轮排序结果是4,3,2,1,5,可以看出数字5已经就位,下一轮无需比较最后1个数;
第2轮排序结果是3,2,1,4,5,可以看出数字4,5已经就位,下一轮无需比较最后2个数;
第3轮排序结果是2,1,3,4,5,可以看出数字3,4,5已经就位,下一轮无需比较最后3个数;
第4轮排序结果是1,2,3,4,5,可以看出数字1,2,3,4,5已经就位。

根据上边推论得知:
如果我们的数组长度是n,那么就需要进行n-1轮冒泡,若此时是第i轮,那么这一轮我们需要n-i-1次交换。

当然这个是特殊情况,如果普及到一般情况是否符合呢?这个验证工作可以交给代码来完成:

    int target_[5] = 5,4,2,5,1;
    int t = 0;
    for (int i = 0; i < n - 1; ++i) 
        for (int j = 0; j < n - 1 - i; ++j) 
            if(target[j] < target[j+1])
                t = target[j];
                target[j] = target[j+1];
                target[j+1] = t;
            
        
    

(冒泡排序核心代码)
经过验证,我们在特殊情况下推出来的理论完全适合一般情况,因此该推论成立。

三、代码实现

main.c

#include <stdio.h>
#include "bubbleSort.h"

int main() 
    int target_list[6] = 5,4,2,5,16,8;
    int length = sizeof(target_list)/4;
    bubbleSort(target_list,length);

    //输出结果
    for (int i = 0; i < 6; ++i) 
        printf("%d  ",target_list[i]);
    
    return 0;

bubbleSort.h

// 简介: 邻居好说话——冒泡排序
// 思想: 每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来
// Created by lanyan on 05/02/2022.

#ifndef SORTINGALGORITHM_BUBBLESORT_H
#define SORTINGALGORITHM_BUBBLESORT_H

//冒泡排序 5 4 3 2 1
void bubbleSort(int target[], int length)
    int t = 0;
    for (int i = 0; i < length - 1; ++i) 
        for (int j = 0; j < length - 1 - i; ++j) 
            if(target[j] < target[j+1])
                t = target[j];
                target[j] = target[j+1];
                target[j+1] = t;
            
        
    

#endif //SORTINGALGORITHM_BUBBLESORT_H

四、运行结果

五、算法解析

  1. 冒泡排序的核心部分是双重嵌套循环。不难看出冒泡排序的时间复杂度是 O(N^2)。这是一个非常高的时间复杂度。
  2. 正如Donald E. Knuth所说:““冒泡排序除了它迷人的名字和导致了某些有趣的理论问题这一事实之外,似乎没有什么值得推荐的。”
  3. 很多初学者会纠结于要进行几轮排序,每轮要比较多少次的问题上,其实没有必要,只要记住了特殊情况,其他情况都会迎刃而解。
  4. 还有人会纠结于循环从0开始还是从1开始的问题,这里我举一个例子:

(1)从0开始循环:

    for (int i = 0; i < 5; ++i) 
        printf("hello ");
    

运行结果为:

(2)从1开始循环:

    for (int i = 1; i <= 5; ++i) 
        printf("hello ");
    

运行结果为:

相信其中的差别你已经能看的清楚,既然这两种方式是等价的,可以互相替换的,又怎么会有循环从0开始还是从1开始的问题呢?

六、BUG记录

  1. 第i轮,这一轮我们需要n-i-1次交换,注意也有一个减1,毕竟先有n - 1轮,后有n - i - 1次交换。

排序算法的程序实现——冒泡排序复习

【教材分析】

本节课是浙江教育出版社《算法与程序设计》中《排序算法的程序实现》的内容。冒泡排序算法是程序设计中的重要算法,对它的学习既是对已经学过的三种程序设计结构的综合运用,又能为后续对分查找的学习作好铺垫。引领学生走进算法,揭开排序算法程序实现的神秘面纱。学习本节课,不仅会填补学生关于程序设计的认知,也会对整个排序算法建立起更丰富的知识结构。通过冒泡排序的变形,从易到难引领学生设计自已易操作易理解的实例,目的在复习以前知识点的同时,帮助学生理解知识、引导学生内化模块化设计思想,让学生感受到VB功能的强大及感悟算法的魅力。

 

【学情分析】

本教案的教学对象是高二学生。在本节课前,学生已经了解什么是冒泡排序算法,怎样用冒泡排序算法来解决实际问题的基本思路。但在学习排序算法的过程中学生可能会对数组变量的变化及循环结构变形的理解上存在一定困难,对看懂这些代码并对其进行正确把握需要仔细地分析。

 

【教学目标】

    1. 通过对属性窗口代码的设计,学生能进一步提高VB冒泡排序程序代码的理解与程序调试能力,掌握并学会分析冒泡排序的相关变式

    2. 通过自主实践,结合常见的变式,加深对冒泡排序思想的理解;

    3. 掌握VB程序设计的一般方法;

    4. 感受程序变化与优化,提升程序的阅读与分析能力。

       

      【教学重点和教学难点】

      教学重点:冒泡排序算法的变形

      教学难点:冒泡排序程序阅读与分析

       

      【教学方法 】

      讲授法、任务驱动法

       

      教学过程】

  1. 引入

教学内容与师生活动

设计意图

1.冒泡排序

2.简单变量、数据元素的交换

3.展示VB窗口及排序效果图

1.复习回顾冒泡排序的基本要点

2使学生掌握利用VB设计程序的一般流程及操作方法,明确上机调试的效果

二、探究实践

教学内容与师生活动

设计意图

任务一:产生9个1位数的自然数

1.复习回顾设计窗口、属性窗口及相关函数

2.产生随机数,为以下程序调试作准备工作

任务二:

(1)经典的冒泡排序分析与上机调试

(2)相反的冒泡排序分析与上机调试

通过对属性窗口代码的设计,让学生复习回顾冒泡排序程序代码的理解与程序调试能力及一些技巧,增强学生处理信息、编程的能力。

任务三:

改进的冒泡排序分析与上机调试

感受程序变化与优化,增强学生对程序的阅读与分析能力,使学生体会程序的微变所产生的功能差异。让学生自主实践,通过指引使学生分析程序中的主要部分,结合常见的变式加强学生对冒泡排序的应用能力。

三、扩展提高

教学内容与师生活动

设计意图

扩展提高1:双向冒泡排序分析

扩展提高2::去重冒泡排序分析

培养学生自主学习能力,探索创新能力和综合运用知识的能力。

四、总结,反思延伸

1.经典冒泡排序、相反冒泡排序、改进冒泡排序、双向冒泡排序

2.提升要求: 去重冒泡排序

 

以上是关于排序算法_冒泡排序(算法设计与C代码实现)的主要内容,如果未能解决你的问题,请参考以下文章

算法与数据结构--经典排序算法Python实现

排序算法——冒泡排序(C语言实现)

C++/Python冒泡排序与选择排序算法详解

算法交换排序——快速排序+冒泡排序

算法_基本排序算法之冒泡排序,选择排序,插入排序和希尔排序

JavaScript算法(冒泡排序选择排序与插入排序)