【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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值