C笔记 - 算法:冒泡排序
冒泡排序
1 - 冒泡排序:存在 n 个不同大小的气泡,由底至上地把较小或较大的气泡逐步地向上升,这样经过一轮遍历后,最小或最大的气泡就会被上升到顶部。如此循环遍历.......最终会使 n 个气泡大小有序排列
2 - 冒泡排序的思想实质是两两比较,将比较后的结果升上
3 - 代码示例:基准版 | 改进版
1 #include <stdio.h> 2 int* bubbleSort(int arr[],int length); // 冒泡排序(基准版) 3 int* bubbleSortHSK(int arr[],int length); // 冒泡排序(改进版) 4 5 int main(int argc, const char * argv[]) { 6 7 // 数组 8 int arr1[] = {11,122,46,59,70}; 9 // 元素个数 10 int arrLen = sizeof(arr1)/sizeof(arr1[1]); 11 12 printf("============== 冒泡排序(基准版)=============\n"); 13 int *endArray = bubbleSort(arr1, arrLen); 14 15 printf("最终结果\n"); 16 for (int i = 0; i < arrLen; i ++) { 17 printf("%d ",endArray[i]); 18 if (i == arrLen - 1) { 19 printf("\n"); 20 } 21 } 22 23 printf("\n\n============== 冒泡排序(改进版)=============\n"); 24 int arr2[] = {11,122,46,59,70}; 25 int *finalArray = bubbleSortHSK(arr2, arrLen); 26 27 printf("最终结果\n"); 28 for (int i = 0; i < arrLen; i ++) { 29 printf("%d ",finalArray[i]); 30 if (i == arrLen - 1) { 31 printf("\n"); 32 } 33 } 34 35 return 0; 36 } 37 38 // 基准版 39 int* bubbleSort(int arr[],int length){ 40 41 // 外层控制轮数 42 for (int i = 0; i < length - 1; i++) { 43 44 printf("第 %d 轮",i+1); 45 46 // 内层控制次数 47 for (int j = 0; j < length - 1 - i; j++) { 48 49 // 升序 50 if (arr[j] > arr[j+1]) { 51 arr[j] = arr[j]^arr[j+1]; 52 arr[j+1] = arr[j]^arr[j+1]; 53 arr[j] = arr[j]^arr[j+1]; 54 } 55 56 printf("\n第 %d 次交换结果:",j+1); 57 for (int i = 0; i < length; i ++) { 58 printf("%d ",arr[i]); 59 } 60 } 61 printf("\n---------------------------------------\n"); 62 } 63 64 return arr; 65 }; 66 67 // 改进版:减少不必要的遍历,提高效率 68 // 当第 1 轮遍历完成后,整个数组已经实现了升序 69 // 但是程序依旧在执行,造成资源浪费 70 // 改进后执行完第 2 轮便结束遍历 71 int* bubbleSortHSK(int arr[],int length){ 72 73 // 默认解锁 74 int aLock = 1; 75 76 // 把锁加进外层遍历 77 for (int i = 0; i < length - 1 && aLock; i++) { 78 79 printf("第 %d 轮",i+1); 80 // 遍历开始时上锁 81 aLock = 0; 82 83 // 内层 84 for (int j = 0; j < length - 1 - i; j++) { 85 if (arr[j] > arr[j+1]) { 86 87 // 解锁:一旦符合交换条件就解锁 88 aLock = 1; 89 90 arr[j] = arr[j]^arr[j+1]; 91 arr[j+1] = arr[j]^arr[j+1]; 92 arr[j] = arr[j]^arr[j+1]; 93 } 94 95 printf("\n第 %d 次交换结果:",j+1); 96 for (int i = 0; i < length; i ++) { 97 printf("%d ",arr[i]); 98 } 99 } 100 printf("\n---------------------------------------\n"); 101 } 102 103 return arr; 104 }
日志信息
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)