🎈个人主页:JAMES别扣了
💕在校大学生一枚。对IT有着极其浓厚的兴趣
✨系列专栏目前为C语言初阶、后续会更新c语言的学习方法以及c题目分享.
😍希望我的文章对大家有着不一样的帮助,欢迎大家关注我,我也会回关,大家一起交流一起互动,感谢大家的多多支持哈!🎉欢迎 👍点赞✍评论⭐收藏
前言
上文我们已经了解了数组和指针之间不一般的关系,相信读者们对于C语言的理解又更加深上一层楼,本文的主要目的是为上文的内容做一个适要的总结,以及介绍一个经典指针与数组结合的题目,更好地让读者们理解深层次的指针,这篇文章适合对C语言有一定基础的读者,基础薄弱的读者和C语言初学者可以翻阅本博主以往C语言系列文章,感谢您的关注,点赞,评论,祝大家的技术日益增长!!!
往期高质量C语言文章(94+质量分):
C语言指针与数组(不适合初学者版):一篇文章带你深入了解指针与数组!-CSDN博客
C语言指针(下):一篇文章让你秒懂基础!(5000字)-CSDN博客
C语言指针(上):一篇文章让你秒懂基础!-CSDN博客
C语言数组:一篇文章让你秒懂基础!-CSDN博客
冒泡排序
方法1:
#include <stdio.h>
void bubble_sort(int arr[], int sz) {
int i, j;
for (i = 0; i < sz - 1; i++) {
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[] = {3, 1, 7, 5, 8, 9, 0, 2, 4, 6};
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
for (int i = 0; i < sz; i++) {
printf("%d ", arr[i]);
}
return 0;
}
冒泡函数
1.void bubble_sort(int arr[], int sz): 这是一个名为bubble_sort的函数,它接受一个整数数组arr和一个整数sz(数组的大小)作为参数。
2.int i, j;: 定义了两个循环计数器i和j。
3.外层循环for (i = 0; i < sz - 1; i++): 这个循环负责确保所有元素都至少被比较一次。因为每经过一次外层循环,最大的元素就会被冒泡到它应该在的位置(数组的末尾),所以每次可以减少一次内层循环的比较。
4.内层循环for (j = 0; j < sz - i - 1; j++): 这个循环负责比较相邻的元素,并根据需要交换它们的位置。
if (arr[j] > arr[j + 1]): 这个条件语句检查当前元素是否大于其相邻的下一个元素。
如果条件为真,就交换这两个元素的位置。、
主函数
1.int arr[] = {3, 1, 7, 5, 8, 9, 0, 2, 4, 6};: 定义了一个整数数组arr并初始化了一些值。
2.int sz = sizeof(arr) / sizeof(arr[0]);: 计算数组arr的大小,并将其存储在变量sz中。
3.bubble_sort(arr, sz);: 调用bubble_sort函数对数组arr进行排序。
4.for (int i = 0; i < sz; i++): 这是一个简单的循环,用于打印排序后的数组。
5.printf("%d ", arr[i]);: 打印数组中的当前元素。
6.return 0;: 表示程序正常结束。
方法2:
//⽅法2 - 优化
void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{
int i = 0;
for(i=0; i<sz-1; i++)
{
int flag = 1;//假设这⼀趟已经有序了
int j = 0;
for(j=0; j<sz-i-1; j++)
{
if(arr[j] > arr[j+1])
{
flag = 0;//发⽣交换就说明,⽆序
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
if(flag == 1)//这⼀趟没交换就说明已经有序,后续⽆序排序了
break;
}
}
int main()
{
int arr[] = {3,1,7,5,8,9,0,2,4,6};
int sz = sizeof(arr)/sizeof(arr[0]);
bubble_sort(arr, sz);
for(i=0; i<sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
方法2:(优化)
1. 引入优化变量 flag
在外部循环的开头,引入了一个名为 flag
的变量,并初始化为1。这个变量用来表示当前这趟遍历中是否发生了交换。
2. 内部循环
在内部循环中,如果检测到相邻的两个元素是逆序的(即 arr[j] > arr[j+1]),则执行交换操作,并将 flag 设置为0,表示发生了交换。
if(arr[j] > arr[j+1])
{
flag = 0; // 发生交换就说明,未序
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
3. 检查 flag
在内部循环结束后,检查 flag 的值。如果 flag 仍然是1,说明在这趟遍历中没有发生任何交换,数组已经是有序的,此时可以提前终止排序。
if(flag == 1) // 这趟没交换就说明已经有序,后续无需排序了
break;
4. main 函数
在 main 函数中,首先定义了一个整数数组 arr,然后计算数组的长度 sz,接着调用 bubble_sort 函数进行排序,最后使用循环遍历数组并打印排序后的结果.
int main()
{
int i; // 声明变量 i
int arr[] = {3,1,7,5,8,9,0,2,4,6};
int sz = sizeof(arr)/sizeof(arr[0]);
bubble_sort(arr, sz);
for(i=0; i<sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
5.总结
这个优化版本的冒泡排序算法通过减少不必要的遍历次数来提高性能。如果数组已经部分有序,或者在排序过程中很快就变得有序,那么这个优化可以显著减少算法的运行时间。然而,如果数组几乎完全逆序,那么优化版本和标准版本的性能差异将不会太大
总结
冒泡排序是一种简单直观的排序算法,但是其时间复杂度较高,不适用于大数据集。然而,通过引入标志位进行优化,我们可以在保持算法简单性的同时,提高其处理大数据集的效率。
在编写代码时,我们应该注意代码的可读性和可维护性,尽量使用简洁明了的注释来解释代码的功能和实现方式。同时,我们也需要关注算法的时间复杂度和空间复杂度,以便在实际应用中选择最合适的排序算法。文章来源:https://www.toymoban.com/news/detail-852830.html
总的来说,冒泡排序虽然简单,但是通过优化方法,我们可以使其在处理特定数据集时更加高效。对于初学者来说,理解并掌握冒泡排序及其优化方法,有助于他们更好地理解和掌握排序算法的基本原理和应用技巧。文章来源地址https://www.toymoban.com/news/detail-852830.html
到了这里,关于C语言指针(适合C语言进阶者):一道题带你深入理解数组与指针的关系的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!