【C语言习题】31.冒泡排序


作业标题

冒泡排序

作业内容

实现一个对整形数组的冒泡排序

2.解题思路

先了解一下冒泡排序:

两两相邻的元素进行比较,如果前面元素大于后面元素就交换两个元素的位置,最终的结果是最大的一个元素移动到了最后的位置。

如果有n个元素那么【冒泡操作】重复n-1次即可排序完成。
在这里插入图片描述

3.具体代码

void bubble_sort(int arr[], int sz) {
    //趟数
    int i = 0;
    for (i = 0; i < sz - 1; i++) {
        //一趟内部的两两比较
        int j = 0;
        for (j = 0; j < sz - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
}

int main()
{
    int arr[] = { 1, 3, 2, 8, 34, 4, 77, 85, 96, 1, 10 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    int i = 0;
    printf("排序之前:");
    for (i = 0; i < sz; i++){
        printf("%d ", arr[i]);
    }
    printf("\n");

    bubble_sort(arr, sz);

    printf("\n排序之后:");
    for (i = 0; i < sz; i++){
        printf("%d ", arr[i]);
    }

    return 0;
}

打印:

在这里插入图片描述

代码讲解:

  1. 先定义一个整型数组arr,用来存放要排序的元素。

  2. 定义一个整型变量sz,利用sizeof函数来求arr数组里元素的个数。

  3. 定义整形变量i,打印排序之前:

  4. 进入for循环,依次通过数组下标打印原数组元素。

  5. 换行

  6. 将数组首元素地址arr和数组元素个数sz作为实参传递给bubble_sort()函数

  7. 先定义整型变量i

  8. 进入for循环,这里的for循环是嵌套的,当i=0的时候,把arr[0]和后面的其他元素依次比较。

    如果arr[0]里面的元素比arr[1]大,那么就互换两个元素。

    换完之后如果arr[1]的元素比arr[2]大,那么就互换两个元素。重复操作。

    换完之后如果arr[1]的元素比arr[2]小,那么就继续进入外层循环。

  9. 如果arr[0]里面的元素比arr[1]小,那么就继续进入外层循环,取出arr[1]和后面的元素比较,重复上面的操作。

  10. bubble_sort()函数执行完成后,数组的元素就被排序成功了。

  11. 换行,打印:排序之后:

  12. 进入for循环,依次通过数组下标打印冒泡排序后的数组元素。


优化:如果某次冒泡结束后,序列已经有序了,后面剩余元素的冒泡可以省略

void BubbleSort(int array[], int size)
{
    // 外层循环控制冒泡排序的趟数
    // size-1表示:最后一趟区间中只剩余1个元素,该趟冒泡可以省略
    for(int i = 0; i < size-1; ++i)
    {
        int isChange = 0; 
        // 具体冒泡的方式:用相邻的两个元素进行比较,前一个大于后一个元素时,交换着两个数据,依次直到数组的末尾
        for(int j = 1; j < size-i; ++j)
        {
            if(array[j-1] > array[j])
            {
                int temp = array[j-1];
                array[j-1] = array[j];
                array[j] = temp;
                
                isChange = 1;   // 如果本次冒泡进行数据交换了,说明本次还是无序的,就将isChange设置为1
            }
        }
        
        // 如果本次冒泡中,元素没有交换,则本次开始冒泡时,数据已经有序了,后面的冒泡可以不用进行了
        if(!isChange)
            return;
    }
}

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-19 04:26:07       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-19 04:26:07       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-19 04:26:07       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-19 04:26:07       20 阅读

热门阅读

  1. 事务&AOP

    2024-06-19 04:26:07       6 阅读
  2. 算法刷题笔记 二进制中1的个数(C++实现)

    2024-06-19 04:26:07       5 阅读
  3. 代码随想三刷二叉树篇2

    2024-06-19 04:26:07       8 阅读
  4. QT day4

    QT day4

    2024-06-19 04:26:07      6 阅读
  5. 浅封装BeanUtils,优雅实现List数据copy拷贝

    2024-06-19 04:26:07       8 阅读
  6. 8086/8088计算机寄存器知识详解

    2024-06-19 04:26:07       11 阅读
  7. [qt][报错】[Makefile:1293: moc_widget.cpp] Error 1

    2024-06-19 04:26:07       10 阅读
  8. 【Qt】xml文件节点读取

    2024-06-19 04:26:07       7 阅读