尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

用c语言实现冒泡排序

用c语言实现冒泡排序 一、冒泡排序1.冒泡排序的作用冒泡排序可以将一组数字按照从小到大或从大到小的顺序进行重新排列使数字规整排列。2.冒泡排序的逻辑冒泡排序将从左到右依次将两个相邻的数字进行比较将较大的数字放置一侧较小的数字放在另一侧。重复这一步骤就可以实现排序。例如对 { 5, 6, 4, 7, 9 } 这一数组从小到大进行排序。第1次5 和 6 比 → 5 6不交换 → { 5, 6, 4, 7, 9 }第2次6 和 4 比 → 6 4交换 → { 5, 4, 6, 7, 9 }第3次6 和 7 比 → 6 7不交换 → { 5, 4, 6, 7, 9 }第4次7 和 9 比 → 7 9不交换 → { 5, 4, 6, 7, 9 }以此类推最终这一数组变为{ 4, 5, 6, 7, 9 }二、用代码实现冒泡排序1.分析在上文我们已经理解了冒泡排序的逻辑那么我们就需要使用代码来实现它。但在实际操作前我们需要对这一问题进行进一步的分析1代码逻辑要实现冒泡排序需要以下三个步骤1获取数组main函数2数组排序Bubble_Sort冒泡排序函数3打印数组Print打印函数下面我们就一起实现这一功能。2.main函数获取数组首先我们不妨先定义一个数组arr来存放我们的数据并让他能够获取用户输入#include stdio.h int main() { int arr[10] { 0 }; //初始化数组 for (int i 0; i 10; i) { scanf(%d, arr[i]); //获取用户输入 } return 0; }然后我们需要在 main 函数里面调用Bubble_Sort这个函数但我们目前并没有对这个函数进行任何的声明也不知道我们需要传入什么参数所以先不急于调用先完成Bubble_Sort的设计。3.Bubble_Sort冒泡排序函数根据设计该函数不需要传回任何值所以类型应该为void。其次在这个函数中我们需要给数组排序那么一个数组就是必要的。所以在函数的开头我们需要传入一个数组arr。代码如下所示void Bubble_Sort(int arr[]) { }在完成这一步后我们就需要正式开始排序了。首先我们应判断从左到右的相邻数字大小问题要比较并交换可以使用if函数先进行判断然后引入一个变量来实现两个值交换的效果(由小到大排序)int i 0; if (arr[i] arr[i 1]) { int num arr[i]; arr[i] arr[i 1]; arr[i 1] num; }注如果不明白这里交换值的逻辑可以看下面这张图片但是仅仅只有这几行代码只能交换第一个元素和第二个元素所以我们需要循环这一过程for(int i0;i10;i) { if (arr[i] arr[i 1]) { int num arr[i]; arr[i] arr[i 1]; arr[i 1] num; } }但是这样循环的问题也很明显打开调试运行这一段代码可以发现假如我们输入的数组为{5,4,7,1,6,8,0,9,2,3}运行之后的结果为{5,7,4,6,8,1,9,2,3,0}明显不符合我们的要求。那么问题出在哪里呢我们再比较的时候只是从左到右把相邻的都比较一次这个次数明显是不够的。所以需要外面再嵌套一层循环将这个比较的过程重复执行直至所有的元素排列完成。void Bubble_Sort(int arr[]) { for(int j 0 ;j 10; j) { for (int i 0; i 9; i) { if (arr[i] arr[i 1]) { int num arr[i]; arr[i] arr[i 1]; arr[i 1] num; } } } }现在我们完成了Bubble_Sort函数的制作接下来我们就需要把我们的成果输出出来。4.Print打印函数与初版完整代码众所周知数组是无法直接打印的那么我们就需要遍历它的每一个元素把每个元素都打印出来。由于这个函数也不需要返回值需要传入一个数组 arr 所以代码如下所示void Print(int arr[]) { for (int i 0; i 10; i) { printf(%d , arr[i]); } }最后让我们总结一下上文的内容就可以得到#include stdio.h void Print(int arr[]) { for (int i 0; i 10; i) //遍历元素并打印 { printf(%d , arr[i]); //为了美观在%d的后面加上了一个空格 } } void Bubble_Sort(int arr[]) { for(int j 0; j 10; j) { for (int i 0; i 9; i) //交换数值 { if (arr[i] arr[i 1]) { int num arr[i]; arr[i] arr[i 1]; arr[i 1] num; } } } Print(arr); //打印数组 } int main() { int arr[10] { 0 }; //初始化数组 for (int i 0; i 10; i) { scanf(%d, arr[i]); } Bubble_Sort(arr); //排序数组 return 0; }三、优化代码虽然现在的代码已经可以实现冒泡排序的功能但是代码还有很多地方是可以优化的1.数组长度调整在本文中数组的长度被控制在了 10 这个长度上但假如我们想要改变数组的长度就需要反复去改上面的代码很麻烦我们不妨定义一个变量 sz让它来计算我们数组的长度。我们可以在main函数中加上这一行int szsizeof(arr)/sizeof(arr[0]);即数组的大小除以一个元素的大小这样我们就可以实时更新数组的长度了。最后我们把Bubble_Sort和Print函数中也传入sz这个变量把里面的 10 替换为sz就完成了。对比一下两版代码初版把长度写死成10优化后通过 sz 自动适应代码更灵活了。2.去掉多余比较我们在排序时可以注意到我们明明排序出了右面的值但是我们在下一次比较时还会对它们进行比较这无疑会影响我们代码的效率。我们可以发现当第 j 轮结束后数组末尾已经排好了 j 个元素所以内层循环只需要比较剩下的sz - j - 1对。j从 0 开始排好1个时j 1排好9个时j 9外循环j sz - 1就结束了不会多跑一轮。因此我们在比较的时候不妨将Bubble_Sort中for循环内部的for循环的判断i sz这行代码改为i sz - j就可以去掉我们排序好的部分了。此外外循环当数组排列 10 个元素时当排列好 9 个元素时最后一个元素就已经排列好了不需要再排列一次可以优化代码将外循环的次数 -1 。3.提前结束排序如果数组在某一次排序后就是有序的那么我们可以让它停止排序提前输出结果。我们不妨定义一个新的变量flag当flag为 1 时就说明发生了交换反之则说明数组已经有序。 代码实现如下void Bubble_Sort(int arr[], int sz) { for (int j 0; j sz-1; j) { int flag 0; for (int i 0; i sz - j - 1; i) //交换数值 { if (arr[i] arr[i 1]) { int num arr[i 1]; arr[i 1] arr[i]; arr[i] num; flag 1; } } if (flag 0) //判定是否提前有序 { break; } } Print(arr, sz); //打印数组 }4.完整代码展示#define _CRT_SECURE_NO_WARNINGS //这行代码用于解决在vs studio中安全报错的问题 #include stdio.h void Print(int arr[], int sz) { printf(输出); for (int i 0; i sz; i) //遍历元素并打印 { printf(%d , arr[i]); //为了美观在%d的后面加上了一个空格 } } void Bubble_Sort(int arr[], int sz) { for (int j 0; j sz-1; j) { int flag 0; for (int i 0; i sz - j - 1; i) //交换数值 { if (arr[i] arr[i 1]) { int num arr[i 1]; arr[i 1] arr[i]; arr[i] num; flag 1; } } if (flag 0) //判定是否提前有序 { break; } } Print(arr, sz); //打印数组 } int main() { int arr[10] { 0 }; //初始化数组 int sz sizeof(arr) / sizeof(arr[0]); printf(输入); for (int i 0; i sz; i) { scanf(%d, arr[i]); //获取用户输入 } Bubble_Sort(arr, sz); //排序数组 return 0; }我们来测试一下测试通过。四、补充说明1.Bubble_Sort中的细节在Bubble_Sort中两个循环的判定条件均为数组元素个数- 1 - j那为什么要减一呢因为内循环中有arr[i] arr[i 1]这一部分假如i可以等于 9那么i1就可以等于 10而arr中的下标最多只到9导致数组溢出产生错误。2.从大到小排序如果想要实现从大到小排序也很简单只需要将Bubble_Sort中的if判断全都颠倒过来就行了。修改后代码if (arr[i] arr[i 1]) { int num arr[i]; arr[i] arr[i 1]; arr[i 1] num; }五、结语以上就是本期内容。限于个人能力文章难免有考虑不周或表述不清的地方欢迎大家在评论区批评指正一起交流进步
返回列表