一、算法基本思想

(1)基本思想

冒泡排序的基本思想就是:从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队列的队尾,从而成为有序序列的一部分;下一次继续这个过程,直到所有数据元素都排好序。

算法的核心在于每次通过两两比较交换位置,选出剩余无序序列里最大(小)的数据元素放到队尾。

二、算法实现

void BubbleSort(int *arr, int len)
{assert(arr);int i = 0;int j = 0;int tmp = 0;for (i = 0; i < len - 1; i++)     //n-1趟{for (j = 0; j < len -i- 1; j++)       {if (arr[j]>arr[j + 1]){tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}

    冒泡排序还有三种优化方式:(以下都是以升序为例)

例如要排序下面这组数据: 0  1  2  3  4  5  6   7  9  8

经过第一趟冒泡排序已经有序了,下面的几趟已经是多余的,这时我们可以加一个标志位flag,若那一趟没有交换数据,这这时已经有序,我们就可以退出排序,不必进行下来的几趟。

算法实现:

void BubbleSort(int *arr, int len)
{assert(arr);int i = 0;int j = 0;int flag = 0;int tmp = 0;for (i = 0; i < len - 1; i++){flag = 1;                             for (j = 0; j < len - i - 1; j++)     //每排序一趟,则必然后面有一个已经有序,可以缩小排序的范围{if (arr[j]>arr[j + 1])             //只要要交换数据,则flag就会被修改{tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;flag = 0;                   //只要还未完全有序,则修改flag为0}}if (flag)                            {break;}}
}

冒泡再次优化的方法!!!

例如要排序下面这组数据:1  4  3  2  6  7  8  9

经过第一趟冒泡排序比较了,发现后面数据没有交换已经有序,接下来几趟比较后面的数据已经是多余的,这时我们可以记录每一次交换的位置,下一次从第一个数据比较到最后一次交换位置即可,不必再次比较后面的数据。

算法实现:

void BubbleSort(int *arr, int len)
{assert(arr);int i = 0;int j = 0;int flag = 0;int tmp = 0;int m = 0;                  //用来记录最后一次交换的位置int k = len-1;for (i = 0; i < len - 1; i++){m = 0;flag = 1;for (j = 0; j < k; j++)       //无序区的范围只从第一个元素,到上一趟最后一次交换的位置k{if (arr[j]>arr[j + 1]){tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;flag = 0;                   m = j;}}if (flag)                          {break;}k = m;                             //将k置成最后一次交换的位置}
}

冒泡排序还有第三种优化方式:

对下面这组这组数进行排序:2  3  4  5  6  7  8  9  10  1

只有后面两个数据无序,前面已经有序,按照以上优化冒泡需要进行多次。这时,我们采用正反交替扫描,正着找最大值,翻着找最小值,一趟就可以使数据有序。

void BubbleSort(int *arr, int len)
{assert(arr);int i = 0;int j = 0;int flag = 0;int m = 0;       //记录最后一次交换的位置int n = 0;int k = len - 1;for (i = 0; i < len - 1; i++){m = 0;flag = 1;//正序扫描找最大值for (j = n; j < k; j++)       //无序区的范围只从第一个元素,到上一趟最后一次交换的位置k{if (arr[j]>arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;flag = 0;                    m = j;}}k = m;if (flag)             {break;}//反序扫描找最小值for (j = k; j>n; j--)       //无序区的范围只从第一个元素,到上一趟最后一次交换的位置k{if (arr[j]<arr[j - 1]){int tmp = arr[j];arr[j] = arr[j - 1];arr[j - 1] = tmp;flag = 0;                  }}n++;if (flag)                   {break;}                           //将k置成最后一次交换的位置}
}

若比较的数据不是整形是其他类型怎么处理,这是我们需要支持泛型编程。

基础知识:

void * :通用指针(无符号指针)或叫做泛型指针,它的特点有:

(1)它用于临时存储地址

(2)它不能解引用

(3)它不能进行算术运算,因为呢,它就是临时的盒子,所以呀,不能依赖它进行计算,总不可能依赖一个通用的盒子计算有   类型的数据吧

算法实现:

//4.泛型冒泡
typedef int(*PCmp)(void *vp1, void *vp2);//泛型比较
void Swap(void* vp1, void*vp2,int size)
{void* temp = malloc(size);memcpy(temp, vp1, size);memcpy(vp1, vp2, size);memcpy(vp2, temp, size);free(temp);
}
void BubbleSort(void* arr, int len, int elemsize, PCmp cmp)
{void* var1;void* var2;int k = len - 1;int m = 0;bool flag = 1;for (int i = 0; i < len - 1; ++i){for (int j = 0; j < k; ++j){var1 = (char*)arr + j*elemsize;var2 = (char*)arr + (j + 1)*elemsize;if (cmp(var1, var2)>0){Swap(var1, var2, elemsize);m = j;flag = 0;}}if (flag) break;k = m;}
}
int Cmp_int(void *vp1, void *vp2)
{return *(int *)vp1 - *(int *)vp2;
}int Cmp_str(void *vp1, void *vp2)
{return strcmp(*(char **)vp1, *(char **)vp2);
}void Test()
{int arr[] = { 3, 5, 7, 9, 0, 12, 45, 6, 78, 23, 44, 10 };BubbleSort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), Cmp_int);char *brr[] = { "abc", "aaa", "bcd", "xyz", "ccccc", "hhh" };BubbleSort(brr, sizeof(brr) / sizeof(brr[0]), sizeof(char *), Cmp_str);getchar();}
int main()
{Test();}

运行结果:

三、性能(算法时间、空间复杂度、稳定性)分析

 (1)时间复杂度

当原始序列“正序”排列时,冒泡排序总的比较次数为n-1,移动次数为0,也就是说冒泡排序在最好情况下的时间复杂度为O(n);

当原始序列杂乱无序时,冒泡排序的平均时间复杂度为O(n^2)。

(2)空间复杂度

冒泡排序排序过程中需要一个临时变量进行两两交换,所需要的额外空间为1,因此空间复杂度为O(1)。

(3)稳定性

冒泡排序在排序过程中,元素两两交换时,相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

排序--Bubble的优化和性能(算法时间、空间复杂度、稳定性)分析相关推荐

  1. 简单排序算法时间空间复杂度分析及应用(4)-二分插入排序

    简单排序算法时间空间复杂度分析及应用(4)-二分插入排序 背景: 顾名思义,这个二分插入排序是直接插入排序的进化版,主要变化的地方就是在内循环部分,即外循环的循环节点在确定区域的位置查询方式由原来的直 ...

  2. 算法时间空间复杂度计算—空间复杂度

    一.空间复杂度定义 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度. 一个算法在计算机存储器上所占用的存储空间,包括程序代码所占用的空间,输入数据所占 ...

  3. 简单排序算法时间空间复杂度分析及应用(7)-希尔排序

    希尔排序,属于插入排序的一种,是直接插入排序的加强版.在希尔排序中引入了步长(gap)的概念,然而在插入排序中,步长默认为1.正如我们直接堆插入排序的分析,数据集合的排列顺序对插入排序的效率会由很大的 ...

  4. 算法及时间/空间复杂度的分析

    算法(Algorithm) 对特定问题求解步骤的一种描述,是为解决一个或一类问题给出的一个确定的.有限长的操作序列 算法的基本特征 ①输入:有零个或多个输入 ②输出:有一个或多个输出 ③有穷性:在执行 ...

  5. 912. 排序数组——归并排序Java时间复杂度空间复杂度稳定性分析

    目录 1.题目 2.思路 归并排序--nlogn 思想--递归 代码 时间复杂度--O(nlogn) 空间复杂度--O(n) 稳定性--稳定 3.结果 1.题目 2.思路 这个题可以作为练习手写各种排 ...

  6. Algorithm Master Road:算法的时间/空间复杂度

    很多同学都觉得算法很难,难以入门,难以理解,更难以掌握和运用,其实归根溯源,我们可以把所有的问题都通过枚举法来解决,但是受困于「时间」和「空间」的因素,有的时候并不能枚举所有的情况,所以需要通过精妙的 ...

  7. 排序算法 | 简单选择排序,算法的图解、实现、复杂度和稳定性分析

    今天讲解一下简单选择排序的原理以及实现.复杂度和稳定性分析 这个内容很简单,轻松加愉快,很快就过了~ 目录 简单选择排序 1 基本思想 2 动态图解 3 代码 4 复杂度分析 简单选择排序 1 基本思 ...

  8. C++实现各种排序以及复杂度,稳定性分析

    代码如下: #include<iostream> using namespace std;void Bubble_Sort(int *a, int n) {bool flag;int tm ...

  9. 性能优化专题 - JVM 性能优化 - 04 - GC算法与调优

    目录导航 前言 Garbage Collect(垃圾回收) 如何确定一个对象是垃圾? 引用计数法 可达性分析 垃圾收集算法 标记-清除(Mark-Sweep) 复制(Copying) 标记-整理(Ma ...

最新文章

  1. 华理c语言设计网上作业,华东理工大学第一学年第二学期网上作业参考答案C语言设计1...
  2. formal method lecture 7 文件系统
  3. 恕我直言,IDEA的Debug,你可能只用了10%
  4. 《程序员代码面试指南》第二章 链表问题 删除无序链表中值重复的链表
  5. cookie封装做免输入登录
  6. Python:通过执行100万次打印来比较C和python的性能,以及用C和python结合来解决性能问题的方法 .
  7. C#实现treeview节点上下左右自由移动
  8. matlab对有周期性噪声的图像去噪,数字图像中去除周期性噪声研究.doc
  9. clip和z-index的用法
  10. js基础知识汇总08
  11. 谷歌翻译用不了解决办法
  12. J-flash 的简易使用教程
  13. 象牙大钢琴II压缩版-Synthogy Ivory by JR Samples II Kontakt
  14. 如何成为一个游戏制作人——教程企划
  15. 用photoshop做电影胶片效果
  16. python3数据库框架_python3大框架简介 小收藏
  17. 【设计模式】-常见面试题汇总
  18. python少儿编程讲师笔试题_小码王教育儿童编程教师面试:做笔试题(填空题和编程题,填空题 - 职朋职业圈...
  19. elementUI使用卡槽二次封装table(亲测可用)
  20. leetcode:13、罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

热门文章

  1. Nacos服务注册中心
  2. F数的定义和物理含义
  3. android 仿 淘宝淘口令
  4. 安装版系统封装入门详细解说
  5. 关于华硕错误0x0000009c蓝屏
  6. Swiper插件之Animate动画
  7. Tensorflow2.x读取手写体数字识别MNIST数据集
  8. Blender图解教程:新手入门练习1(简单的立体模型)
  9. 查询并批量插入数据的Sql命令
  10. 户外听歌小音库,舒适不伤耳,Sanag A11S Pro秘境寒鸦气传导耳机体验