首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

冒泡排序

给定一个N个元素数组,冒泡法排序将: 如果元素大小关系不正确,交换这两个数(在本例中为a> b), 比较一对相邻元素(a,b), 重复步骤1和2,直到我们到达数组末尾(最后一对是第(N-2)和(N-...1)项,因为我们数组开始) 到目前为止,最大元素将在最后位置。...外循环正好运行N迭代。 但内部循环运行变得越来越短: 当 i = 0,(N-1迭代(比较和可能交换)时。 当 i = 1,(N-2迭代时,......当 i =(N-2)时,1迭代, 当 i=(N-1),0迭代. 因此,总迭代次数=(N-1)+(N-2)+ ... + 1 + 0 = N *(N-1)/ 2。...冒泡排序实例分析 数组 arr = [5, 1, 4, 2, 8] 为例说明,加粗数字表示每次循环要比较两个数字: 第一外循环 ( 5 1 4 2 8 ) → ( 1 5 4 2 8 ), 5

53620

冒泡排序到快速排序做那些优化

最后比较a[n-2]与a[n-1]值。这样处理一轮后,a[n-1]值一定是这组数据中最大。 再对a[0]~a[n-2]相同方法处理一轮,则a[n-2]值一定是a[0]~a[n-2]中最大。...算法介绍 设要排序数组是A[0]……A[n-1] 首先任意选取一个数据作为关键数据,然后将所有比它小数都放到它前面,所有比它大数都放到它后面,这个过程称为一趟快速排序。...一趟快速排序算法 设置两个变量 i、j,排序开始时候:i=0,j=n-1第一个数组元素作为关键数据,赋值给 pivot,即 pivot =A[0]; 从 j 开始向前搜索,即由后开始向前搜索(j...); 不过,快排最坏复杂度即退化为冒泡排序时,时间复杂度为O(n^2),比如一种待排序序列已经为升序序列,那么轮分割区间长度为1,n-1,不就是退化为了冒泡排序了吗。...在实际操作中,有很多技术可以降低最坏情况发生概率,快速排序克服了这个问题后,使得自己应用很广泛。

1K90
您找到你想要的搜索结果了吗?
是的
没有找到

C语言:函数递归

=  n ∗ (n − 1)! 这样思路就是把⼀个较⼤问题,转换为⼀个与原问题相似,但规模较⼩问题来求解n!---> n*(n-1)! (n-1)!...---> (n-1)*(n-2)!.... 直到n是1或者0时,不再拆解 再稍微分析⼀下,当 n<=1 时候,n阶乘是1,其余n阶乘都是可以通过上述公式计算。...1234%10就能得到4,然后1234/10得到123,这就相当于去掉了4 然后继续对123%10,就得到了3,再除10去掉3,以此类推 不断 %10 和 \10 操作,直到1234⼀位都得到;...但是这⾥有个问题就是得到数字顺序是倒着,我们这个思路设想一个Print函数 Print(n) 如果n是1234,那表⽰为 Print(1234) //打印1234⼀位 其中1234中4可以通过...(n-1)+Fib(n-2) int Fib(int n) { if(n<=2) return 1; else return Fib(n-1)+Fib(n-2); } int main() {

9810

java冒泡排序概练_Java冒泡排序

因为是从第一个数开始和相邻数进行比较,所有就需要循环n-1,即比较n-1趟,又因为一趟都会找到最大一个数放在后面,所以一趟比较都会比上一趟少比较一,即n-1n-2n-3…..1...(n是需要排序数字个数) 二、java代码实现基本思路 利用二重for循环实现,外重循环设为i(一趟),内重循环设为j(一趟每一比较),假设有n个数字需要排序,设int[] num=new...int[n],则外循环重复n-1,内循环重复n-1n-2n-3…….1,所以i值依次为1、2…..n-1,对应j值为n-1n-2n-3…….1。...,需要循环n-1,即比较n-1趟 for (int i = 0; i < num.length – 1; i++) { //内重循环,即一趟每一比较,每次比较n-1n-2n-3……...=true ; //设置标志 //内重循环,即一趟每一比较,每次比较n-1n-2n-3…….1 for (int j = 0; j < num.length – 1 – i; j++)

56040

原创系列 |「冒泡排序」提升为「快速排序」,都发生了什么?

最后比较a[n-2]与a[n-1]值。这样处理一轮后,a[n-1]值一定是这组数据中最大。 再对a[0]~a[n-2]相同方法处理一轮,则a[n-2]值一定是a[0]~a[n-2]中最大。...算法介绍 设要排序数组是A[0]……A[n-1] 首先任意选取一个数据作为关键数据,然后将所有比它小数都放到它前面,所有比它大数都放到它后面,这个过程称为一趟快速排序。...一趟快速排序算法 设置两个变量 i、j,排序开始时候:i=0,j=n-1第一个数组元素作为关键数据,赋值给 pivot,即 pivot =A[0]; 从 j 开始向前搜索,即由后开始向前搜索(j...); 不过,快排最坏复杂度即退化为冒泡排序时,时间复杂度为O(n^2),比如一种待排序序列已经为升序序列,那么轮分割区间长度为1,n-1,不就是退化为了冒泡排序了吗。...在实际操作中,有很多技术可以降低最坏情况发生概率,快速排序克服了这个问题后,使得自己应用很广泛。

28810

当初为什么不好好学习算法?

冒泡排序 假设数组arr长度为N,冒泡排序过程为: 在arr[0~N-1]范围上: arr[0]和arr[1],谁大谁来到1位置; arr[1]和arr[2],谁大谁来到2位置 [N-2]和arr[N...外循环正好运行N迭代。但内部循环运行变得越来越短: 当 i = 0,(N-1迭代(比较和可能交换)时。 当 i = 1,(N-2迭代时,......当 i =(N-2)时,1迭代, 当 i=(N-1),0迭代....估算:很明显,如果arr长度为N一步常数操作数量,如等差数列一般,所以,总常数操作数量 = a*(N²) + b*N + c (a、b、c都是常数) 所以选择排序时间复杂度为O(N²)。...很明显,在最差情况下,如果arr长度为N,插入排序一步常数操作数量,还是如等差数列一般。

37520

青蛙跳台阶问题暨斐波那契数列

两个子问题构成了最终问题解,所以当n>=3时,青蛙就有f(n)=f(n-1)+f(n-2)种跳法。...2 == n) return 2; return fib(n-1)+fib(n-2); } 3.1时间复杂度分析 递归实现斐波那契数,效率是非常低下,因为对子问题求解...设f(n)为参数为n时间复杂度,很明显:f(n)=f(n-1)+f(n-2)变为f(n)-f(n-1)+f(n-2)=0,仔细一看,这就是数学上二阶线性常系数齐差分方程,求该差分方程解,就是求得...image.png 有了关于差分方程一些定义和概念,现在应该知道为什么f(n)-f(n-1)+f(n-2)=0叫作二阶线性常系数齐差分方程了吧。...关于斐波那契数列递归 求解期间复杂度我们简化其求解过程,按照如下方式求解。 image.png 递归时间复杂度是: 递归次数*每次递归中执行基本操作次数。

92522

青蛙跳台阶

两个子问题构成了最终问题解,所以当 n>=3 时,青蛙就有 f(n) = f(n-1) + f(n-2) 种跳法。...return fib(n-1)+fib(n-2); } 5.1 时间复杂度 递归实现斐波那契数,效率是非常低下,因为对子问题求解 fib(n-1) 和 fib(n-2) 两者存在重叠部分,对重叠部分重复计算造成了浪费...设 f(n) 为参数为n时间复杂度,很明显,f(n) = f(n-1) + f(n-2) 变为 f(n) - f(n-1) - f(n-2) = 0,仔细一看,这就是数学上二阶线性常系数齐差分方程...有了关于差分方程一些定义和概念,现在应该知道为什么 f(n)-f(n-1)-f(n-2)=0 叫作二阶线性常系数齐差分方程了吧。...关于斐波那契数列递归求解期间复杂度我们简化其求解过程,按照如下方式求解。 递归时间复杂度是:递归次数*每次递归中执行基本操作次数。所以时间复杂度是: O(2^n) 。

91220

【算法与数据结构】复杂度深度解析(超详解)

N数组中搜索一个数据x 最好情况:1找到 最坏情况:N找到 平均情况:N/2找到 在实际中一般情况关注是算法最坏运行情况,所以数组中搜索数据时间复杂度为O(N) 常见复杂度 常数阶O(...Σ(n-1)+(n-2)+...+1 = n(n-1)/2 = O(n^ 2) ,外层循环n,内层循环每个都为O(n), 所以整体时间复杂度是外层循环次数乘内层循环时间复杂度,即O(n)×O(n)=O..."沉底",即升序排列, 数组长度为n排序,需要进行n-1轮比较才能完成排序,一轮循环需要进行n-1元素比较,最坏情况下每次比较都需要交换元素,所以总共需要进行(n-1)+(n-2)+...+1 =...2^N) 原因: 斐波那契数列递归定义是:Fib(N) = Fib(N-1) + Fib(N-2),每次调用Fib函数,它会递归调用自己两。...二叉树高度就是输入N,一层节点数都是2N次方,根据主定理,当问题可以递归分解成固定数目的子问题时,时间复杂度就是子问题对数,即O(c^ N )。

15410

小算法大智慧之排序(一)

我们可以总结下,N个数字要排序完成,总共进行N-1趟排序,第i趟排序次数为(N-i),所以可以用双重循环语句,外层控制循环多少趟,内层控制一趟循环次数。...时间复杂度分析 对包含n个数据数组进行冒泡排序,最坏情况下,需要进行n*(n-1)/2交换。最好情况下,无需进行交换。取中间值n*(n-1)/4,表示初始有序平均情况。...也就是平均情况下需要n*(n-1)/4交换操作,比较操作肯定要比交换操作多,而这个复杂度上限是O(n²)。 所以可粗略地认为冒泡排序平均情况下时间复杂度是O(n²)。...,需要比较N-1; 第二排序,需要比较N-2; .........第N-1排序,需要比较1; 比较次数=(N-1)+(N-2)+...+1=((1+ N-1)*(N-1))/2=N²/2 + N/2 所以时间复杂度为:O(N²) 三、区别 一、相同点 1.都有两层循环

56650

单片机常用14个C语言算法

) 1)有n个数(存放在数组a(n)中),第一趟将相邻两个数比较,小调到前头,经n-1两两相邻比较后,最大数已“沉底”,放在最后一个位置,小数上升“浮起”; 2)第二趟对余下n-1个数(最大数已...“沉底”)按上法比较,经n-2两两相邻比较后得次大数; 3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j两两比较。...,进行一测量 ,把测量结果放于队尾 ,而扔掉原来队首一个数据 ,这样在队列中始终就有 N 个 “最新” 数据。...当计算平均值时 ,只要把队列中 N 个数据进行算数平均 ,就可得到新算数平均值。这样进行一测量 ,就可得到一个新算术平均值。...余数 M[1] = M - b[n-1]*pow(2, 2*n-2) (2) N高位b[n-2]可以采用试探法来确定。

1.4K40

数据结构基础题复习

A.n/2 B.n C.1 D.n-2 分析:按照上图介绍,把第n-1个元素移动到n,把第n-2个元素移动到n-1,就完成了两移动。...(n-1)/2 B.n C.2n D.n-i 分析:删除第n-1个位置元素需要移动0个元素;删除第n-2个位置元素需要移动1个元素;…;删除第1个位置元素需要移动n-2个元素;删除第0个位置元素需要移动...( T ) (3)浏览器记录用户访问地址实现“回撤”操作,可以通过“队列”结构来实现。(F ) 分析:这个操作应该是栈结构来实现,比如回撤了两,肯定是先回撤到后访问地址,是后进先出。...(n阶、n*n对称矩阵A下三角部分(包括主对角线元素)行序为主序方式存放于一维数组B中,那么,A中任一个下三角元素aij(i≥j≥0)在数组B中下标位置k(k≥0)为( B )。...分析:第0趟冒泡排序需要进行n-1元素间比较,第1趟冒泡排序需要进行n-2元素间比较,…,第i冒泡排序需要进行n-i-1元素间比较 (4)稳定排序算法指( A )。

6800

什么是递归--What does resursion mean?

递归三大要素 说明:刚开始学习递归可能会使自己一头雾水,看别人写递归程序总是能够读懂,但是自己实际操作却困难重重,所以,在开始学习之前,不妨掌握递归精髓,即我们自己写是应当怎么样看法去看待递归问题代码写法...考虑是否重复计算 告诉你吧,如果你使用递归时候不进行优化,是有非常非常非常多问题被重复计算。 啥是子问题? f(n-1),f(n-2)…就是 f(n) 问题了。...例如对于案例2那道题,f(n) = f(n-1) + f(n-2)。递归调用状态图如下: ? 看到没有,递归计算时候,重复计算了两 f(5),五 f(4)。。。。...补充-递归在内存空间栈实现 ? 递归实现可以看作是一压栈操作,我们调用一递归体,比如print(n-1),就会一地压栈。...为何无return递归语句能够实现,主要原因有在栈中递归体执行顺序是先进后出原则,每次运行完一递归体(比如n-2)之后,继续执行栈语句相当于进入下一个递归体(n-1)。

55720

Leetcode 题目解析:70. 爬楼梯

添加与搜索单词 - 数据结构设计 一 摘要 在前面算法题目解析:从一道题目看动态规划这篇文章中,描述了动态规划概念、原理和典型示例,今天用几道典型动态规划题目来做为练手,达到掌握目的。70....如果我们从最后一选择倒推,f(n)表示到达第n个台阶可能方法数,那么就可以很容易得到f(n) = f(n-1)+f(n-2)。...当前子问题解将由上一问题解推导而出。很显然,题目符合这个特征。因此可以使用动态规划方法。...(1)比较容易,f(n) = f(n-1)+f(n-2)就是我们这个场景状态转移方程; (2)边界条件,因为状态转移方程需要先知道f(n-1)和f(n-2),所以说递推计算只能从f(2)开始,并初始化...如果滚动数组不好理解,也可以简单地定义n_1 和 n_2两个变量,计算一后,更新n_1=f(i),n_2=f(i-1),下次就可以用这两个值计算f(i+1)了。

31620

告别递归,谈谈我一些经验

第一种跳法:第一我跳了一个台阶,那么还剩下n-1个台阶还没跳,剩下n-1个台阶跳法有f(n-1)种。...第二种跳法:第一跳了两个台阶,那么还剩下n-2个台阶还没,剩下n-2个台阶跳法有f(n-2)种。 所以,小青蛙全部跳法就是这两种跳法之和了,即 f(n) = f(n-1) + f(n-2)。...这也是我要和你们说关于递归结束条件是否够严谨问题,有很多人在使用递归时候,由于结束条件不够严谨,导致出现死循环。...考虑是否重复计算 告诉你吧,如果你使用递归时候不进行优化,是有非常非常非常多问题被重复计算。 啥是子问题?f(n-1),f(n-2)….就是 f(n) 问题了。...例如对于案例2那道题,f(n) = f(n-1) + f(n-2)。递归调用状态图如下: ? 看到没有,递归计算时候,重复计算了两 f(5),五 f(4)。。。。

48200

【数据结构】八大排序之简单选择排序算法

基本操作是: 每一通过n-i关键字间比较,从n-i+1个数据中选出关键字最小(大)数据,并和第i(1≤i≤n)个数据交换 重复n-1上述操作,直到全部待排序数据元素排完....算法动图演示如下: 二.简单选择排序代码实现 算法实现步骤:(升序为例) 在元素集合arr[i]~arr[n-1]中选择关键码最小(大)数据元素....在剩余arr[i+1]~arr[n-1](arr[i]~arr[n-2])集合中,重复上述步骤,直到集合剩余一个元素....: 元素挪动交换次数很少,但是元素比较次数很多,并且无论是数组天生顺序情况还是天生逆序情况,元素比较次数都是一样,都是:T(n)=(n-1)+(n-2)+...+2+1=n(n-1) / 2...而对于交换次数而言,最好时候,交换次数为0,最坏时候,交换次数为n-1. 基于最终排序时间是交换次数和比较次数总和,因此,总时间复杂度依然是O(n^2).

7310

数据结构_时空复杂度

,只需要遍历一就可以了,执行N-1 最坏情况是顺序是完全相反 若初始文件是反序,需要进行n-1趟排序。...趟排序要进行n-i 关键字比较(1≤i≤n-1),且每次比较都必须移动记录三来达到交换记录位置。...先依次跟0-n异或,并把结果赋值给自己(val^=) 然后再跟数组每个元素异或,最后得到结果就是消失数字 因为异或顺序不影响结果,相当于 这样0-n数组中如果有重复数字,异或之后结果为...,数组中消失数字在0-n中落单,跟val(值为)异或之后值还是它本身。...基本操作执行数是T(N) = (N-1)+N O(N) 方法四: 利用等差数列计算 0-n本身就是一种等差数列,根据求和公式减去数组各元素,剩下值就是消失数字 O(N) 2.旋转数组OJ链接 输入

20320

用memoization优化递归算法

递归函数,通过把一个大而复杂问题简化为许多但规模较小问题同一个相似模式来计算,降低了解题难度;通过调用自身函数,极大地减少了函数代码量优点而为开发者喜爱。...对数列进行分析,我们发现,从自三项开始,第N值就等于其前两项之和,即第N-1和第N-2和。...return n;   }else{     cache[n-1]=cache[n-1]||fibonacci(n-1);//应用||或运算符“短路”特性,若在数组中找到其值,则直接使用数组值,若没有...,再进行计算,并将值存入数组     cache[n-2]=cache[n-2]||fibonacci(n-2);     return cache[n-1]+cache[n-2];//返回数组值...  } } 由上可以看出,在计算过一后,数据被存入数组,再次调用时便会优先找到数组值而免于大量计算,从而提升效率。

851100
领券