Bubble

数据结构之排序算法(C语言)

早过忘川 提交于 2021-02-18 05:25:00
一.冒泡排序 冒泡排序是最简单的排序之一了,其大体思想就是通过与相邻元素的 比较 和 交换 来把小的数交换到最前面。这个过程类似于水泡向上升一样,因此而得名。举个栗子,对5,3,8,6,4这个无序序列进行冒泡排序。首先从前向后冒泡,5和3比较,换数,序列变成3,5,8,6,4。同理5和8比较,不用交换,还是3,5,8,6,4。8和6比较,交换,变成3,5,6,8,4。8最后和4比较,交换,得到3,5,6,4,8。这样一次冒泡就完了,把最大的数8排到最后面了。对剩下的序列依次冒泡就会得到一个有序序列。冒泡排序的时间复杂度为O(n^2)。 代码实现: /* 冒泡排序 */ #include <stdio.h> void bubble_sort( int *a, int len) { int i,j,t; for (i= 0 ;i<len- 1 ;i++) // 整体比较次数 (比如两个数只需要比较一次)所以要减一 for (j= 0 ;j<len-i- 1 ;j++) // 每一次需要哪几个数来比,减掉1个(比如两个数只需要比较一次),再减掉已经排好了的数. if (a[j]>a[j+ 1 ]) { t = a[j]; a[j] = a[j+ 1 ]; a[j + 1 ] = t; } } int main() { int a[ 5 ] = { 5 , 3 , 8 , 6 , 4 };

R可视化 | 气泡图

北战南征 提交于 2021-02-13 03:38:18
气泡图 气泡图是一种多变量图表,是散点图的变体,也可以认为是 散点图和百分比区域图的组合 [1] 。气泡图最基本的用法是使用三个值来确定每个数据序列,和散点图一样。气泡图通过气泡的位置及面积大小,可分析数据之间的相关性。 本文可以看作是《R语言数据可视化之美》的学习笔记。前两部分可见(跳转): 趋势显示的二维散点图 分布显示的二维散点图 该书对气泡图的绘制并不是非常详细,小编将内容进行了大量拓展。下面的例子将一步步带你完成气泡图的绘制。本文内容丰富,希望大家都能学到自己想要的内容。 下面的例子将一步步带你完成气泡图的绘制。本文内容丰富,希望大家都能学到自己想要的内容。 本文框架 数据介绍 数据集来源gapminder包中,包含了1704行和6个变量。其中6个变量含义分别为: country 国家142个水平 continent 大陆5个水平 year 1952年-2007年(间隔为5年) lifeExp 出生预期寿命,以年计数 pop 人口数 gdpPercap 人均国内生产总值(扣除通货膨胀因素后的美元) 由于数据过多,我们感兴趣的是年份为2007年的数据,所以使用dplyr包进行数据处理,具体数据处理案例可见我写的另一篇推送: [R数据科学]tidyverse数据清洗案例详解 。数据缩略版如下: 手把手绘制 geom_point()函数构建 气泡图是添加了第三维度的散点图

如何使用JavaScript创建气泡图以可视化选举结果

谁说我不能喝 提交于 2021-02-05 09:25:55
AnyChart是基于JavaScript (HTML5) 的图表控件。使用AnyChart控件,可创建跨浏览器和跨平台的交互式图表和仪表。AnyChart 图表目前已被很多知名大公司所使用,可用于仪表盘、报表、数据分析、统计学、金融等领域。 在当今数据呈指数增长的时代,可视化是工具箱中必不可少的技能。流行的技术包括条形图,折线图,饼图和气泡图等。 对于任何开发人员,尤其是刚起步的开发人员,使用JavaScript从头开始构建交互式图表可能都是一项艰巨的工作。这就是为什么我们拥有JS图表库的原因,该库使您可以更轻松,更快捷地创建有见地的可视化效果! 继续阅读以了解如何使用这些库之一创建JavaScript气泡图。 JavaScript图表库 有很多很棒的JavaScript库可供使用,并且每个库都有自己的优缺点。但是最好的部分是,使用所有图表构建图表的过程几乎是相似的。因此,您可以与任何人一起学习绳索,然后使用适合您特定项目要求的任何库。 我决定与本教程一起使用AnyChart JavaScript库创建气泡图。我认为对于初学者到中级编码技能的开发人员来说,这是一个不错的选择。AnyChart具有丰富的文档资料,非常灵活,并且具有多种图表类型,可以启动您的可视化之旅。 什么是气泡图,它将显示什么? 我知道您很高兴开始创建可视化文件,但是在我们开始之前

五种C语言非数值计算的常用经典排序算法

二次信任 提交于 2021-02-01 10:50:10
摘要: 排序是计算机的一种操作方法,其目的是将一组“无序”的记录序列调整为“有序”的记录序列,主要分为内部排序和外部排序。 排序 排序是计算机的一种操作方法,其目的是将一组“无序”的记录序列调整为“有序”的记录序列,主要分为内部排序和外部排序。 (1)冒泡排序(起泡排序) 冒泡排序(Bubble Sort),其基本思路是,对于一组要排序的元素列,依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面,如此继续,直到比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成。 优点: 稳定; 缺点: 慢,每次只能移动相邻两个数据。 假设要对含有n个数的序列进行升序排列,冒泡排序算法步骤是: ①从存放序列的数组中的第一个元素开始到最后一个元素,依次对相邻两数进行比较,若前者大后者小,则交换两数的位置; ②第①趟结束后,最大数就存放到数组的最后一个元素里了,然后从第一个元素开始到倒数第二个元素,依次对相邻两数进行比较,若前者大后者小,则交换两数的位置; ③重复步骤①n-1趟,每趟比前一趟少比较一次,即可完成所求。 1、任意读入10个整数,将其用冒泡法按升序排列后输出。 #define n 10 void main() { int a[n],i,j,t; for(i=0;i<n;i++) scanf("%d",&a[i]); for(j=1;j<=n-1;j++)

php经典算法面试题

我的梦境 提交于 2021-01-22 09:40:05
原文地址: https://www.woozee.com.cn/article/35.html 1、一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。 function king($m, $n) { if (1 >= $n) { return $n; } $monkeys = range(1, $n); $count = $n; while ($count > 1) { $remainder = $m % $count; unset($monkeys[$remainder - 1]); $monkeys = array_values($monkeys); $count--; } return array_shift($monkeys); }    2、有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛。 function cows ($n) { $cows = [1]; for ($i = 1; $i <= $n; $i++) { // 新出生的牛 $new_number = 0; foreach ($cows as

算法总结

倾然丶 夕夏残阳落幕 提交于 2021-01-16 18:41:20
算法与数据结构核心指标和梳理脉络 核心指标 时间复杂度 要拆分成最基本的常数时间 最终的时间复杂度会忽略的低阶项和高阶项系数,并且会抹掉常数项; 如果高阶都一样,基本就不用理论分析了,直接随即大样本进行测试就行,因为加减乘除和位运算都是o(1)的常数项时间,显然位运算是更快的; 空间复杂度 流程必须要的空间不算额外空间;作为输入参数输出结果都不是额外空间,比如对数组的拷贝功能,需要申请一个新的数组进行输出,则认为还是bigo(1)的额外空间; 空间是固定的,与功能无关自己的空间,如果开辟的空间和样本数无关,就是bigO(1),否则如果需要开辟额外数组,那么就是bigO(N); 常数项时间 固定的不能再拆分的固定时间的操作 分析算法怎么样一定要先看算法的最好和最差的情况,这就是说算法怎么样的思路; 考研中题目特点:怎么是最优解;以及别的思路怎么说服你才是最优解,以及怎么给低分,同样时间复杂度,怎么给高分; 梳理脉络 知道怎么算的算法 知道怎么试的算法 对数器 如果没有想到比较的方法,使用暴力递归也是一个最终极的对数器方案 刷题: 务必要注意general case 和 corner case 两种情况,缩进不要大于三次 选择排序 依次取出最小的数放在最左边或者最大的数放在最右边,如此反复; https://www.runoob.com/w3cnote/selection-sort

《编程珠玑,字字珠玑》45678读书笔记——编程技巧

对着背影说爱祢 提交于 2021-01-14 02:32:54
写在最前面的 就像上一篇文章说的,“编程永远是后话”!在有了可靠的问题分析过程和数据结构的选择,能正确运行的“二分搜索”代码出现之前,把其主要的思路先在草稿上实现,即伪代码。但由于伪代码执行结果的不确定性,需要有一个验证的过程。笔者非常不喜欢这个过程,因为这个过程很繁琐,而且推出的结论不一定是正确的(毕竟没有实实在在在机器上运行得到正确的结果),在笔者看来,给一个算法题,知道用什么算法,数据结构,如果能用伪代码实现,离成功已经不远了。 但后来我又反驳了自己的观点(矛盾体啊),理由:至少到目前为止,写的都是小程序、小算法题,验证过程可能已经被潜移默化解决了。 实战演练:动态规划矩阵连乘最优组合 麻烦来了,今天晚上在实现“动态规划矩阵连乘最优组合”的算法在这个问题中需要填表,通过动态规划解体,就因为表的下标混乱,所以填表的过程比较枯燥(debug了好多次)。 我先在稿纸上用伪代码大概解决了这个问题,但是在真正敲写代码的时候,却发现“伪代码”除了整体上的走向之外(大概的结构),很多细节都有问题。 “大概”伪代码: for i=[0,n-1) for j=[0,n-1-i) col =... //col是填表元素的列 min =... for k=[0,i) t =.... if t<min t = min a[j][col] = min; 其中省略号内的东西待敲进去之后都不正确

图解冒泡排序

生来就可爱ヽ(ⅴ<●) 提交于 2021-01-10 08:34:08
冒泡排序 冒泡排序(Bubble Sort),是一种简单的排序算法。 算法名字由来:越小的元素会经由交换慢慢 "浮" 到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。 算法重复遍历要排序的元素列,依次比较 两个相邻的元素 ,如下图所示。如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。遍历元素的工作是重复的进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 冒泡排序有两种代码实现方式: 将最小的元素 冒 出来 将最大的元素 沉 下去 冒出最小元素 执行过程如下: 从后往前,依次比较两个相邻元素 如果 前面的元素 比 后面元素大,则交换两个元素 对每一对相邻元素做同样的工作,从最后一对到开始的第一对 当第一遍执行完后,第一个元素就是最小的元素 针对所有的的元素重复上述步骤,除了第一个 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 以 [4,7,2,5,1,3] 为例,将最小的元素 冒 出来的示意图如下 从后往前依次比较两个相邻元素,数组中最小的元素是 1 每次比较过后, 1 都会被交换到更靠前的位置 等到第5步过后,数组中的第一个元素就是最小的元素了。 还是以 [4,7,2,5,1,3] 为例,完整的排序过程如下: 上图中 第一趟遍历后,我们将最小的元素 冒 出到第一位

Python3冒泡排序

馋奶兔 提交于 2021-01-02 11:10:49
练习: 将路径为 D:\data.txt 的文件读取,并取出数字部分进行排序(不能使用内置排序方法),这里我们使用冒泡排序法  文件读取并取出数字部分(略) 一:什么叫冒泡排序   冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,一层一层的将较大的元素往后移动,其现象和气泡在上升过程中慢慢变大类似,故成为 冒泡排序 。 1:原理  从第一个和第二个开始比较,如果第一个比第二个大,则交换位置,然后比较第二个和第三个,逐渐往后 经过第一轮后最大的元素已经排在最后,所以重复上述操作的话第二大的则会排在倒数第二的位置。 那重复上述操作n-1次即可完成排序,因为最后一次只有一个元素所以不需要比较 with open('D:\data.txt','r+') as f: res = f.read() print(res) #字符串替换,将空格替换为逗号 res = res.replace('\n',',') print('res为:',res) #字符串分割,将字符串以逗号分隔成为一个列表 m = res.split(',') print('m为:',m) #取出数字部分 li = [] for i in m: if i.isdigit(): li.append(i) #冒泡排序 cd = len(li)

排序算法-冒泡排序

删除回忆录丶 提交于 2020-12-28 03:12:41
算法简介 冒泡排序(Bubble Sort)是一种典型的交换排序算法,持续比较相邻元素,大的挪到后面,因此大的会逐步往后挪,故称之为冒泡。 算法描述 比较相邻的元素。如果第一个比第二个大(小),就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大(小)的数; 针对所有的元素重复以上的步骤,除了最后一个; 重复步骤1~3,直到排序完成。 代码实现 /** * 冒泡排序 * * @param array */ private static void bubbleSort(int[] array) { if (array == null || array.length == 0 || array.length == 1) return; for (int i = 0; i < array.length - 1; i++) { for (int j = 0; j < array.length - 1 - i; j++) {//注意数组边界 if (array[j] > array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } } 性能分析 最好情况下:正序有序,则只需要比较$n$次。故为$O(n)$。 最坏情况下