排序过程:

将第一个记录的keyword与第二个记录的keyword进行比較,若为逆序r[1].key > r[2].key,则交换;然后比較第二个记录与第三个记录;依次类推,直至第n - 1个记录和第n个记录比較为止,第一趟冒泡排序,结果keyword最大的记录被安置在最后一个记录上。

对前n - 1个记录进行第二趟冒泡排序。结果使keyword次大的记录被安置在第n - 1个记录位置。

反复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止。

时间复杂度O(n^2)

简单版:

#include <iostream>
#include <cstdio>
#include <ctime>
#include <iomanip>
using namespace std;int arr[10000];void mySwap(int &a, int &b)
{int t = a;a = b;b = t;
}void bubbleSort(int *a, int len)
{bool alreadySort = false; // 记录假设已经排序完毕,能够提前退出for (int i = len - 1; i >= 0 && !alreadySort; i--) { // 从后往前排序alreadySort = true;for (int j = 0; j < i; j++) {if (a[j] > a[j + 1]) {mySwap(a[j], a[j + 1]);alreadySort = false;}}}
}void printArray(int *a, int len)
{for (int i = 0; i < len; i++) {if (i != 0 && i % 10 == 0) {cout << endl;}cout << setw(3) << a[i] << ' ';}cout << endl;
}int main()
{srand(time(0));cout << "Please input length of array: ";int len;cin >> len;for (int i = 0; i < len; i++) {arr[i] = rand() % 100;}cout << "Before sorting:\n";printArray(arr, len);bubbleSort(arr, len);cout << "After sorting:\n";printArray(arr, len);return 0;
}/*
Please input length of array: 20
Before sorting:
70  53  65  69  99  67  36  49  66  16
58  73  65  20  75  30  93   8  42  57
After sorting:
8  16  20  30  36  42  49  53  57  58
65  65  66  67  69  70  73  75  93  99
*/

改进:记住最后一次交换发生的位置lastExchange,下一趟排序開始时,R[1...lastExchange]是无序区,R[lastExchange...n]是有序区。这样一趟排序可能使当前有序区扩充多个记录,从而降低排序的趟数。

仅仅需改进bublleSort函数:

void bubbleSort(int *a, int len)
{bool alreadySort = false; // 记录假设已经排序完毕。能够提前退出for (int i = len - 1; i >= 0 && !alreadySort;) { // 从后往前排序alreadySort = true;int lastExchange = i; // 记住最后一次交换的位置,能够降低排序趟数for (int j = 0; j < i; j++) {if (a[j] > a[j + 1]) {mySwap(a[j], a[j + 1]);alreadySort = false;lastExchange = j;}}i = (lastExchange < i ? lastExchange : i - 1);}
}

排序 - 冒泡法(改进)相关推荐

  1. 字符串的冒泡排序c语言,c语言单链表冒泡排序_c语言字符串排序冒泡法_c语言链表排序...

    1. #include 2. 3. struct Node; 4. 5. typedef struct Node *PtrToNode; 6. typedef PtrToNode List; 7. t ...

  2. C语言中数组的排序算法详解——选择法、冒泡法、交换法、插入法、折半法

    选择法排序 选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序.从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最 ...

  3. C语言数组的五种简单排序,选择法排序,冒泡法排序、交换法排序、插入法排序、折半法排序

    文章目录 1.选择法排序 2.冒泡法排序 3.交换法排序 4.插入排序 5.折半法排序 6.五种方法比较 1.选择法排序 选择法排序是指每次选择索要排序的数组中的最小值(这里是由小到大排序,如果是由大 ...

  4. verilog实现冒泡法排序

    verilog实现冒泡法排序 // 冒泡法排序 用verilog实现 module sort(input clk,input rst_n,input [3:0] data0,data1,data2,d ...

  5. C语言中怎么用循环统计买法,C语言入门谭浩强版简单选择法冒泡法用数组和for循环进行学生成绩简单统计处理...

    C语言入门谭浩强版 简单选择法排序 冒泡法排序 用数组和for循环进行学生成绩简单统计处理 例如:求个人平均分 学科平均分 单科最高分等 简单选择法 #include #define N 10 voi ...

  6. JS一维数组排序(冒泡法)

    目录 冒泡法排序的思路 冒泡法排序 冒泡法排序的思路 冒泡排序是数组排序的一个常用方法,冒泡排序用到的是for循环的嵌套,外层循环来控制总共要进行几轮,内层循环将数组最大的数进行沉底,循环完成后即完成 ...

  7. C语言 冒泡法排序,选择法排序和插入排序

    实例1 冒泡法排序 数组中有N个整数,用冒泡法将它们从小到大(或从大到小)排序. 实例解析: 排序是非常重要且很常用的一种操作,有冒泡排序.选择排序.插入排序.希尔排序.快速排序.堆排序等多种方法.这 ...

  8. C语言——冒泡法排序应用

    #include <stdio.h> #include <stdlib.h> int main()/*有int main 就会有return 0;如果是void main ,就 ...

  9. PTA 基础编程题目集 7-27 冒泡法排序 C语言

    PTA 基础编程题目集 7-27 冒泡法排序 C语言 将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们.通过一遍扫描,则最后一 ...

最新文章

  1. TensorFlow基础5-可训练变量和自动求导机制
  2. Silverlight 控件的验证
  3. 3n+1猜想(求关键数)
  4. Android SettingProvider详解
  5. 8Manage PPM助力中投证券 项目管理向数字化转型
  6. cocos2d-x C++ 原始工程引擎运行机制解析
  7. vim莫名假死的解决办法
  8. FastStoneCapture屏幕截图软件
  9. [译]Go语言常用文件操作汇总
  10. SpringBoot中AOP实现落地——Filter(过滤器)、Intercepter(拦截器)、Aspect(Spring AOP)
  11. 周末献礼 MyVoix2.0.js 麦克风波形绘制(一)
  12. SQL 判断表是否存在
  13. vp9 segment 详细分析
  14. android wifi 文件共享,一个Android WiFi 文件共享程序
  15. Atitit 工程师程序员技术级别对应表与主要特征 P1--p6 说明 类别 职称 对应技术标志 P5 高级工程师 工程师类 一般四五年 P6 资深开发 工程师类 78年经历 P7 P7
  16. 英语单词常用词根(五)
  17. 一文详细了解针对蓝牙智能应用的超低功耗无线MCU芯片CC2640
  18. nhmicro添加合同模板管理功能
  19. NI-DAQmx安装问题,DAQ助手在Labview中不显示,新建时显示缺少编辑所需要的组件
  20. 人人影视字幕组因盗版视频被查?看剧何去何从

热门文章

  1. jest java_✅使用jest进行测试驱动开发
  2. esxi安装openwrt_双软路由安装——ROS安装、上网、DNS缓存、常用设置(小白教程)...
  3. python生成50个随机数_Python内置random模块生成随机数的方法
  4. 刘子佼 mysql 下载_MySQL数据管理之备份恢复案例解析 23讲 Mysql备份恢复实战 视频教程...
  5. 计算机网络PIC和SDV,SRBSDV和RBSDV检测技术的建立
  6. java执行exe 没捕获到输出_Java程序员注意——六种异常处理的陋习
  7. python作品_Python爬取图虫网摄影作品
  8. 华为手机服务器响应,服务器响应优化
  9. 河海大学2019计算机考研分数线,河海大学2019年硕士研究生复试分数线
  10. mysql表结构设计_表结构设计