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 }
复制代码

日志信息

 

posted on   低头捡石頭  阅读(38)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示