冒泡排序算法介绍

冒泡排序(Bubble Sort)一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序记录为止。这是书上的定义,感觉太弯弯肠子了。冒泡排序是几乎所有学编程的都会学的一个排序,因为其实现思路简单。实际上就是2 相邻元素两两比较,将最值冒到 最后面去,直到将所有的值都冒泡完毕,排序也就完成了。

冒泡排序算法代码

在有n个元素的 arr数组,第1轮冒泡 将 最值冒到 arr[n-1],第2轮冒泡将最值冒泡到arr[n-2],外层循环完毕,数组元素全部冒泡ok,冒泡排序结束。下面是冒泡排序代码:

//冒泡排序
//外层循环1次 将一个最值冒出
//直到将所有值 冒出去
void BubbleSort1(int *arr, int length)
{for (int i = 0; i < length-1; i++){//冒泡排序是2相邻元素进行比较,然后冒泡for (int j = 0; j < length - 1 - i; j++){//升序if (arr[j] > arr[j + 1]){Swap(&arr[j], &arr[j + 1]);}}}
}

冒泡排序算法优化

比如有个数组{9,1,2,3,4,5,6,7,8}。我们进行升序排序,在第1轮冒排序后,已经排序ok,但是我们的普通冒泡排序,还有进行8轮的内层for循环进行比较 ,这不就是浪费时间浪费青春嘛。所以当我们发现排序已经ok了,就可以不用再排序了。加一个排序是否ok的标志位flag 就行了。比如{9,1,2,3,4,5,6,7,8},在第2轮冒泡排序完毕,我们发现没有交换数组元素,就知道排序已经ok,就可以结束循环了。下面是优化后的代码:

//冒泡排序 优化版,添加标志位
//如果内层循环完毕 发现没有交换值,说明排序已经ok了
void BubbleSort2(int *arr, int length)
{int flag = 0;//0 表示没有排好序for (int i = 0; i < length - 1 && flag == 0; i++){flag = 1;//假定排好序了for (int j = 0; j < length - 1 - i; j++){//升序if (arr[j] > arr[j + 1]){flag = 0;//其实还没有排好序呢Swap(&arr[j], &arr[j + 1]);}}}
}

冒泡排序算法复杂分析

内存循环进行两两比较 交换值进行冒泡。在外层

第1轮循环时,arr[0]、arr[1].....arr[n-1],他们两两比较 进行冒泡,总共比较次数为n -1,将第一个最值冒泡到arr[n-1] 处。

第2轮循环时,arr[0]、arr[1].....arr[n-2],他们两两比较 进行冒泡,总共比较次数为n -2,将第二个最值冒泡到arr[n-2] 处。

所以不难得出它的比较的次数是n-1 + n-2 + n-3 + ....1 = n*(n-1)/2 。

时间复杂度为 = n^2/2- n/2 = n^2 ,O(n^2)

冒泡排序和选择排序比较

冒泡排序和选择排序 虽然他们的时间复杂度都是O(n^2),但是由于冒泡排序是进行值的交换,而选择排序是记录最值下标 减少了 值交换的次数,所以选择排序比冒泡排序 效率略微 好一些

完整代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/timeb.h>
#define MAXSIZE 20
#define MAXNUM 51
//交换值
void Swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}
//选择排序 核心是记录最值下标
void SelectSort_Up(int *arr, int length)
{for (int i = 0; i < length - 1; i++){int index = i;//记录最值下标for (int j = i + 1; j < length; j++){//升序if (arr[index] > arr[j]){index = j;}}if (i != index){Swap(&arr[i], &arr[index]);}}
}
//冒泡排序
//外层循环1次 将一个最值冒出
//直到将所有值 冒出去
void BubbleSort1(int *arr, int length)
{for (int i = 0; i < length-1; i++){//冒泡排序是2相邻元素进行比较,然后冒泡for (int j = 0; j < length - 1 - i; j++){//升序if (arr[j] > arr[j + 1]){Swap(&arr[j], &arr[j + 1]);}}}
}
//冒泡排序 优化版,添加标志位
//如果内层循环完毕 发现没有交换值,说明排序已经ok了
void BubbleSort2(int *arr, int length)
{int flag = 0;//0 表示没有排好序for (int i = 0; i < length - 1 && flag == 0; i++){flag = 1;//假定排好序了for (int j = 0; j < length - 1 - i; j++){//升序if (arr[j] > arr[j + 1]){flag = 0;//其实还没有排好序呢Swap(&arr[j], &arr[j + 1]);}}}
}
//打印数组元素
void PrintArr(int* arr, int length)
{for (int i = 0; i < length; i++){printf("%d ", arr[i]);}printf("\n");return;
}
//获取系统时间
time_t GetSysTime()
{struct timeb time;ftime(&time);return time.time * 1000 + time.millitm;;
}int main(int argc, char *argv[])
{srand((size_t)time(NULL));//设置随机种子int arr1[MAXSIZE] = { 0 };int arr2[MAXSIZE] = { 0 };int arr3[MAXSIZE] = { 0 };//给每个元素设置一个随机值for (int i = 0; i < MAXSIZE; i++){int num = rand() % MAXNUM;arr1[i] = num;arr2[i] = num;arr3[i] = num;}printf("冒泡排序前:\n");PrintArr(arr1, MAXSIZE);printf("普通版冒泡升序:\n");BubbleSort1(arr1, MAXSIZE);PrintArr(arr1, MAXSIZE);printf("冒泡排序前:\n");PrintArr(arr2, MAXSIZE);printf("优化版冒泡升序:\n");long start1 = GetSysTime();BubbleSort2(arr2, MAXSIZE);long end1 = GetSysTime();PrintArr(arr2, MAXSIZE);/*printf("选择排序前:\n");PrintArr(arr2, MAXSIZE);printf("选择排序升序:\n");long start2 = GetSysTime();BubbleSort2(arr2, MAXSIZE);long end2 = GetSysTime();PrintArr(arr2, MAXSIZE);printf("%d个元素选择排序耗费时间:%d\n",MAXSIZE,end1-start1);printf("%d个元素冒泡排序耗费时间:%d\n", MAXSIZE, end1 - start1);*/return 0;
}

代码运行检测

普通冒泡和优化的冒泡排序

选择排序和冒泡排序比较,用10000个元素测试,就不打印了。差距很明显哟。

排序算法:冒泡排序算法优化实现及分析相关推荐

  1. 十大经典排序算法-冒泡排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  2. 排序算法-冒泡排序算法

    2019独角兽企业重金招聘Python工程师标准>>> 冒泡排序算法是所有排序算法中最简单.最基础的一种.冒泡排序算法的思路就是交换排序,通过相邻数据的交换来达到排序的目的. 冒泡排 ...

  3. 经典排序算法----冒泡排序算法及其优化(稳定)

    冒泡排序(稳定) 冒泡排序就是把小的元素往前调或者把大的元素往后调.比较是相邻的两个元素比较,交换也发生在这两个元素之间.所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的:如果两个相等的 ...

  4. 【排序】冒泡排序算法

    特别说明: 对于算法,重在理解其思想.解决问题的方法,思路.因此,以下内容全都假定待排序序列的存储结构为:顺序存储结构. 冒泡排序思想 冒泡排序与插入排序.简单选择排序一样,都是比较简单的一类排序算法 ...

  5. C++常见排序算法——冒泡排序算法

    首先说一下冒泡排序的基本算法思想: 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小.首字母从Z到A)错误就把他们交换过来. 这个算法的名字由来是因为越小的元素会经由交换慢慢 ...

  6. java每轮排序结果,冒泡排序及其优化java

    java冒泡排序及其优化## version1 public static void bubbleSort() { int[] arr={5,6,1,4,3,2,7,8}: for (int i = ...

  7. 数据结构与算法 / 冒泡排序及其优化的三种方式

    一.一般写法 统一使用交换函数: void swap(int& a, int& b) {int tmp = a;a = b;b = tmp;return; } void BubbleS ...

  8. JAVA手写算法 | 冒泡排序算法

    目录 原理 排序演示 JAVA实现 算法分析 算法优化 冒泡排序(Bubble Sort)是一种基础的交换排序. 所谓交换排序就是通过元素的两两比较,判断是否符合要求,如果不符合则交换元素位置来达到排 ...

  9. java 鸡尾酒排序_冒泡排序及优化(Java实现)

    向大端冒泡 public class BubbleSort { public static > void sort(T[] arr) { for (int i = 0, len = arr.le ...

  10. 【java进阶06:数组】使用一维数组模拟栈数据结构 使用二维数组模拟酒店,酒店管理系统 Arrays工具类 冒泡排序算法、选择排序算法、二分法

    目录 数组 二维数组 总结 作业 Arrays工具类 数组 数组总结 及 静态初始化一维数组 /* Array:1.java语言中的数组是一种引用数据类型,不属于基本数据类型,数组的父类是Object ...

最新文章

  1. python 进度条
  2. python中如何快速判断一个值是否大于、小于、等于某个值?
  3. 转 Java中final、finally、finalize的区别与用法
  4. [BZOJ] 2064: 分裂
  5. 微信小程序开发——点击按钮退出小程序的实现
  6. JAVA复合判断_一起来学Java8(四)——复合Lambda
  7. mybatis批量删除提示类型错误
  8. Qt Building the android package failed! 构建失败
  9. SAP 查询分析器的实现的3种方法
  10. 银联支付接口申请流程
  11. SAP 客户端不能访问解决方案
  12. FPGA零基础学习:图像显示系统设计
  13. OpenStack基本安装步骤
  14. 三分钟告诉你MBR和GPT的区别,选择适合自己的
  15. blk_rq_map_user和blk_rq_map_kern
  16. 基于C++的高性能http框架cinatra及其web框架示例feather介绍及开发演示
  17. DELL R730xd 安装PCIE SSD 后风扇转速增高的解决方法手记
  18. Redis的zset结构跳表
  19. 雨听 | 英语学习笔记(九)~作文范文:父母应该送孩子出国留学吗?
  20. HTML的标签与选择器

热门文章

  1. linux maven编译代码,linux shell---- maven编译和部署 tomcat脚本
  2. plpythonu_PostgreSQL PL/Python 函数
  3. matlab cell计算,MATLAB Cell数组 | 学步园
  4. canvas笔记-canvas基本用法
  5. Qt工作笔记-使用SQL中的LIMIT进行数据分页
  6. Spring Boot笔记-目前对Web后端开发的认识
  7. Qt3转Qt5(Ui部分)
  8. php 网页 透明背景图片,php 处理透明背景的图片时的问题
  9. 怎么控制ajax执行先后顺序,[转]多个ajax请求时控制执行顺序或全部执行后的操作...
  10. Rollback Protection