欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 【C语言习题】31.冒泡排序

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

2024/10/25 3:29:26 来源:https://blog.csdn.net/hlyd520/article/details/139785218  浏览:    关键词:【C语言习题】31.冒泡排序

文章目录

    • 作业标题
    • 作业内容
    • 2.解题思路
    • 3.具体代码


作业标题

冒泡排序

作业内容

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

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;}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com