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

为什么冒泡排序外循环在n-1结束?

冒泡排序是一种简单的排序算法,它通过不断比较相邻的元素并交换位置来实现排序。外循环在n-1结束的原因是因为在每一轮外循环中,冒泡排序会将当前未排序部分的最大元素冒泡到最右侧,所以每一轮外循环都会确定一个元素的最终位置。

具体来说,假设待排序数组的长度为n,那么冒泡排序需要进行n-1轮的比较和交换操作。在第一轮外循环中,通过比较相邻元素并交换位置,最大的元素会被冒泡到数组的最右侧。在第二轮外循环中,由于最大的元素已经在最右侧,所以只需要比较和交换前n-1个元素。以此类推,每一轮外循环都会确定一个元素的最终位置,直到最后一轮外循环只需要比较和交换前两个元素,即n-1结束。

冒泡排序的时间复杂度为O(n^2),其中n为待排序数组的长度。尽管冒泡排序的效率相对较低,但它的实现简单,对于小规模的数据排序仍然是一种可行的选择。

腾讯云提供了多种云计算相关产品,其中包括云服务器、云数据库、云存储等。您可以通过访问腾讯云官方网站(https://cloud.tencent.com/)了解更多关于腾讯云的产品和服务。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

java冒泡排序代码_Java冒泡排序

第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束倒数第二的位置上得到一个新的最大数...如此下去,重复以上过程,直至最终完成排序。 三、实现思路: 用二重循环实现,循环变量设为i,内循环变量设为j。...假如有n个数需要进行排序,则循环重复n-1次,内循环依次重复n-1,n-2,…,1次。...,排序过程中只需进行n-1次比较,且不移动记录;反之,若记录序列的初始状态为”逆序”,则需进行n(n-1)/2次比较和记录移动。...新一轮排序开始时,检查此标志,若此标志为0,表示上一次没有做过交换数据,则结束排序;否则进行排序; package 冒泡排序; import java.util.Arrays; /** * 冒泡排序改进版

1.9K61

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

Java的冒泡排序 一、冒泡排序基本概念 冒泡排序,顾名思义,像冒泡一样的排序。...(n是需要排序数字的个数) 二、java代码实现的基本思路 利用二重for循环实现,循环设为i(每一趟),内重循环设为j(每一趟的每一次比较),假设有n个数字需要排序,设int[] num=new...int[n],则循环重复n-1次,内循环重复n-1次、n-2次、n-3次…….1次,所以i的值依次为1、2…..n-1,对应的j的值为n-1、n-2、n-3…….1。...那么,我们应该在排序完成时结束排序,从而降低时间复杂度,我们可以在外重循环里设立一个布尔值flag,使得每一次排序开始前flag=true,如果在内重循环内发生了数据交换,则使flag=false。...新一轮排序开始前检查flag的值,如果flag=true,就说明上一次没有数据交换,那么就结束排序,否则就再开始下一轮排序

58540
  • 巧借Java实现冒泡排序算法

    4、反复重复以上步骤,而且每次循环将最大的元素“冒泡”到当前未排序的末尾。5、最后,重复执行n-1循环,直到所有元素都排好序为止。...,其中,外层循环控制进行n-1次比较和交换的轮数,内层循环用于比较相邻元素并执行交换操作,所以是两层循环使用。...所以为了提高Java中使用冒泡排序的性能,个人觉得可以从下面几个点来进行优化,具体如下所示:1、设置标志位:如果在一次内层循环过程中没有发生元素交换,则说明该数组已经有序了,可以提前结束排序的流程过程...这里再单独举个例子,随机生成一组数字,然后用冒泡排序执行一下,主要是为了说明冒泡排序的稳定性,具体如下:原始待排序数组| 6 | 2 | 4 | 1 | 5 |7 |第一趟排序(循环)第一次两两比较,...(循环),无交换第五趟排序(循环),无交换排序执行完毕,输出最终结果:1 2 4 5 6 7结束语通过本文关于使用Java来实现冒泡排序的操作,想必读者都已经掌握了吧,尤其是刚入门Java的开发者需要好好掌握

    39141

    python用冒泡排序_数组冒泡排序c语言函数

    循环,内层变量为i, 外层为j,在内层循环中不断的比较相邻的两个值(i, i+1)的大小,如果i+1的值大于i的值,交换两者位置,每循环一次,外层的j增加1,等到j等于n-1的时候,结束循环 第一次看不懂很正常...#-*-coding:utf-8-*- #g:/python #冒泡排序 #1.定义一个列表 number=[6665,666,323,124,4442,5,123,412,55] #循环控制冒泡排序的次数...直接输入回车表示结束,用冒泡法进行排序 python 解决冒泡排序法 实在看不懂呀 谁能一行一行… 这个看起来简单,却并不好解释。...python冒泡排序法求告知哪里错了_(:з」∠)_ 恩…Python小新人刚学到冒泡排序那里..回家试了一下不知道为什么就是不对求告知哪里错了,还有最后的None请问是啥..怎么去掉谢谢!!...… 恩…Python小新人刚学到冒泡排序那里.. 回家试了一下不知道为什么就是不对 求告知哪里错了,还有最后的None请问是啥..怎么去掉 谢谢!!  冒泡排序算法的运作如下: 1.

    1.1K10

    排序算法】冒泡排序、选择排序、插入排序

    ---- 对于外层循环执行第n-1排序时,内层循环只比较了第1个元素和第2个元素。 此时已经排列完成,不需要再执行下一趟排序。 即对于外层循环: 只需要排序n-1趟。...不同于冒泡排序,选择排序每趟排序最多只会改变两个元素的位置。不能设置flag检查是否排序完成,也无法通过flag检查。 选择排序需要遍历剩余所有元素,内层循环不能同冒泡循环一样修改右边界。...因此外重循环结束条件为元素个数n而不是n-1第一趟插入中,我们将原数列的第1个元素取出作为有序数列,将第2个元素取出作为新元素插入,对应的下标从1开始。...虽然结束条件是n,循环的次数仍然是n-1插入元素时,已经内层循环结束条件,此时j小于零,或者已经指向合适位置的前一个位置。因此需要对ints[j+1]进行赋值,而非ints[j]。...上面的代码中,为了便于理解,并没有将所有循环内的变量循环内定义。但出于以上两点原因,建议将变量循环定义,循环内使用。

    19330

    冒泡算法还简单的排序算法:看起来满是bug的程序,居然是对的

    我们定义Pᵢ是经过i次(1 ≤ i ≤ n)循环后得到的数组。 如果算法正确,那么前i项已经是升序排列,即A[1] ≤ A[2] ≤ . . . ≤ A[i]。...P₁显然是正确的,而且这一步和普通的冒泡算法降序没有区别,经过第1次循环,A[1]就是整个数组的最大元素。 接着我们假设Pᵢ成立,然后证明Pi+1成立。...网友:这个算法我以前见过 比最容易理解的冒泡算法还要简单,这个排序算法Hacker News上很快引起了网友的围观。 不少人觉得它“很眼熟”。...两种算法相比,网友此前提出的更容易被理解为什么可以运行。 当然也有歪楼的,有人就调侃自己刚学编程时写过这个算法。 我百分百确定,我刚开始学编程、并想要找到最短的排序方法时就写过它。...这样等所有线程都醒来,排序结束了。 但和作者提出的算法一样,睡眠排序由于多线程的问题,真正实现上也有困难。 此外,这位网友也表示自己看到过这种算法: 我确定我此前看到过这种算法,它没有名字吗?

    28820

    【玩转Python】巧借Python实现冒泡排序

    目录前言基本概念冒泡排序规则使用Python实现冒泡排序拓展:冒泡排序的稳定性结束语前言如果你是计算机专业毕业的科班出身的毕业生,或者你是做软件开发工作,肯定对Python语言并不陌生,而且随着计算机科学技术的普及...4、反复重复以上步骤,而且每次循环将最大的元素“冒泡”到当前未排序的末尾。5、最后,重复执行n-1循环,直到所有元素都排好序为止。...所以为了提高Python中使用冒泡排序的性能,个人觉得可以从下面几个点来进行优化,具体如下所示:1、设置标志位:如果在一次内层循环过程中没有发生元素交换,则说明该数组已经有序了,可以提前结束排序的流程过程...这里再单独举个例子,随机生成一组数字,然后用冒泡排序执行一下,主要是为了说明冒泡排序的稳定性,具体如下:原始待排序数组| 6 | 2 | 4 | 1 | 5 |7 |第一趟排序(循环)第一次两两比较,...(循环),无交换第五趟排序(循环),无交换排序执行完毕,输出最终结果:1 2 4 5 6 7结束语通过本文关于使用Python来实现冒泡排序的操作,想必读者都已经掌握了,尤其是刚入门Python的开发者需要好好掌握

    45841

    冒泡排序

    作为最简单的排序算法之一,冒泡排序给我的感觉就像 Abandon 单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。...给定一个N个元素的数组,冒泡排序将: 如果元素大小关系不正确,交换这两个数(本例中为a> b), 比较一对相邻元素(a,b), 重复步骤1和2,直到我们到达数组的末尾(最后一对是第(N-2)和(N-...冒泡排序的分析 冒泡排序的算法时间分析 比较和交换需要一个以常量为界的时间,我们称之为c。 (标准)Bubble Sort中有两个嵌套循环循环正好运行N次迭代。...冒泡排序的实例分析 以数组 arr = [5, 1, 4, 2, 8] 为例说明,加粗的数字表示每次循环要比较的两个数字: 第一次循环 ( 5 1 4 2 8 ) → ( 1 5 4 2 8 ), 5...1 2 4 5 8 ) → ( 1 2 4 5 8 ) 第四次循环(最后一次) ( 1 2 4 5 8 ) → ( 1 2 4 5 8 ) 冒泡排序的动图演示 冒泡排序的代码实现 public

    55720

    C++实现冒泡排序

    对除了已排序的最后一个元素的剩余元素,重复以上步骤,直到整个数组排序完成。通过不断地比较和交换相邻元素,较大的元素会逐渐“冒泡”到数组的末尾,因此称为冒泡排序。...冒泡排序的空间复杂度为O(1),即不需要额外的空间来存储数据。每一轮比较和交换操作中,只需要使用常数级别的额外空间来存储临时变量。因此,冒泡排序是一种原地排序算法,不会占用额外的内存空间。...循环变量i和j分别控制外层循环和内层循环的次数。每一轮内层循环中,比较相邻的两个元素,如果前面的元素大于后面的元素,则交换这两个元素的位置。经过n-1轮的循环之后,整个数组就被排序完成了。...接着调用 bubbleSort 函数进行冒泡排序,并最终输出排好序的数组。 bubbleSort 函数中,我们使用了两个嵌套的 for 循环。...函数调用:主函数中通过调用bubbleSort(arr, n)来调用定义的冒泡排序函数。返回值:主函数中使用return 0;表示程序正常结束

    22521

    三大主要排序方法总结:快速排序,选择排序冒泡排序

    本文介绍:三大排序方法(快速排序,选择排序冒泡排序)(后续期间可能会发布一篇关于qsort函数的文章) 自我介绍:一个脑子不好的大一学生,c语言接触还没到半年,若涉及到效率等问题,各位都可以评论区提出见解...通过相邻两数的比较,将大的数逐渐移至数组较后的位置,最后将最大的元素冒泡至最后 /*若有n个元素,则一共会进行n-1排序,每次会把最大的推到最后,推到最后的过程中 会进行n-1-i次操作*/ /*...相邻两数比较*/ void mao_pao_paixu(int* arr, int sz) { int i = 0; for (int i = 0; i < sz-1/**/; i++) { //循环...*/; j++) { /*内循环,会进行sz-1-i次比较(与循环原理相同)*/ if (arr[j] > arr[j+1/**/]) { int t = arr[j+1...,则a[j--]=a[i];直到i等于j,本次循环结束(左边已经全为小于基准值的数,右边已经全为大于基准值的数,令a[i]=基准值),递归进入下一次循环,参数为:pai_xu(a,l,i-1);pai_xu

    12110

    冒泡排序算法

    2.这样对数组的第0个数据到n-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第n-1个位置。 3.n=n-1,如果n不为0就重复前面二步,否则排序完成。...---- 例子为从小到大排序,原始待排序数组| 7 | 2 | 4 | 5| 1 | 第一趟排序(循环) 第一次两两比较7 > 2交换(内循环) 交换前状态| 7 | 2 | 4 | 5 | 1...(循环) 第一次两两比较2 < 4不交换 交换前状态| 2 | 4 | 5 | 1 | 7 | 交换后状态| 2 | 4 | 5 | 1 | 7 | 第二次两两比较,4 < 5不交换 交换前状态|...2 | 1 | 4 | 5 | 7 | 交换后状态| 2 | 1 | 4 | 5 | 7 | 第四趟排序(循环) 第一次两两比较2 > 1交换 交换后状态| 2 | 1 | 4 | 5 | 7 |...空间复杂度,冒泡排序是原地排序,空间复杂度为O(1)。冒泡排序算法是稳定的排序算法。

    66010

    为什么快速排序算法效率比较高?

    在这之前,我们先来分析下排序算法界里面的Hello World,其就是大名鼎鼎的冒泡排序,这个排序算法因为思想原理和实现都比较简单,所以大部分程序员都信手拈来,但真实情况是这个算法除了名字比较独特,别的都不值一提...下面我们用数学方式来推导冒泡排序时间复杂度是如何计算的: 首先冒泡排序是基于比较和交换的,比如我们要对n个数字排序冒泡排序需要n-1次遍历,比如我们有10个数字,第一趟循环需要比较9次,第二趟循环需要比较...所以对10个数排序冒泡排序需要近100次比较(大O表示法,实际50次) 下面我们来分析下快速排序: 快速排序的思想采用的是分治策略,非常类似于老子道德经里面描述宇宙演变的文字: 道生一,一生二,二生三...,这里是7,然后右边向后遍历找到一个小于基准的6的数字5停下来,然后交换数组里面7和5的位置之后继续处理,直到i和j的值相等,我们就结束循环,然后把基准数归位,分别处理基准左边的数组和基准右边的数组,...,第一快排是不稳定的,比如数组原始顺序a=9,b=9,c=10,快排排序完可能出现b,a,c,而冒泡排序则是稳定的,因为冒泡是相邻的两个元素比较,完全可以自己掌握需不需要交换,如果等于的时候,而快排则没法做到

    9.5K30

    java编写冒泡排序源代码,用java实现冒泡排序算法,java冒泡算法

    2、冒泡排序过程示例  对关键字序列为49 38 65 97 76 13 27 49的文件进行冒泡排序的过程  3、排序算法  (1)分析  因为每一趟排序都使有序区增加了一个气泡,经过n-1排序之后...各趟排序结束时检查exchange,若未曾发生过交换则终止算法,不再进行下一趟排序。  ...exchange) //本趟排序未发生交换,提前终止算法  return;  } //endfor(循环)  } //BubbleSort  4、算法分析  (1)算法的最好时间复杂度  若文件的初始状态是正序的...5、算法改进  上述的冒泡排序还可做如下的改进:  (1)记住最后一次交换发生位置lastExchange的冒泡排序  每趟扫描中,记住最后一次交换发生的位置lastExchange,(该位置之前的相邻记录均已有序...②造成不对称性的原因  每趟扫描仅能使最重气泡"下沉"一个位置,因此使位于顶端的最重气泡下沉到底部时,需做n-1趟扫描。  ③改进不对称性的方法  排序过程中交替改变扫描方向,可改进不对称性。

    3.6K30

    冒泡排序解读(基于java实现)

    对除了已排序的最后一个元素的剩余元素,重复以上步骤,直到整个数组排序完成。通过不断地比较和交换相邻元素,较大的元素会逐渐“冒泡”到数组的末尾,因此称为冒泡排序。...冒泡排序的时间复杂度为O(n^2),其中n为待排序数组的长度。冒泡排序中,需要进行n-1轮的比较和交换操作。每一轮中,需要比较n-i-1次相邻元素,并可能进行交换操作。...因此,总的比较和交换次数为:(n-1) + (n-2) + ... + 2 + 1 = n * (n-1) / 2由于大O表示法忽略常数和低次项,因此冒泡排序的时间复杂度为O(n^2)。...冒泡排序的空间复杂度为O(1),即不需要额外的空间来存储数据。每一轮比较和交换操作中,只需要使用常数级别的额外空间来存储临时变量。因此,冒泡排序是一种原地排序算法,不会占用额外的内存空间。...循环变量i和j分别控制外层循环和内层循环的次数。每一轮内层循环中,比较相邻的两个元素,如果前面的元素大于后面的元素,则交换这两个元素的位置。经过n-1轮的循环之后,整个数组就被排序完成了。

    13421

    从零开始学习PYTHON3讲义(八)列表类型跟冒泡排序

    但除了第9个元素3,其它元素并没有完成排序。 ? ​以上的操作肯定很适合用一个循环来执行,因为是最核心的位置执行,也称为内循环。相应的,当然有循环,来不断的变换条件,并执行内循环。...上图用来说明循环每次执行的样子。循环嵌套了内循环循环每执行一次,相当于执行一个完整的内循环,也既完成把本次循环找到的最小的数字,“冒泡”到上面“未排序”部分的“最后”位置。 ​...我们再看循环的边界,起始当然也是0,而结束边界,同样是列表元素数量-1。原因是每次循环都将把列表中最小的数值冒泡到最上面,最后最大的元素必然已经剩到了第0个元素,无需再循环。...排序中,循环跟刚才解释的完全一样,范围是从0到n-1。这里有一个小迷惑点,我们知道range本身就不会产生最后一个边界的数字,相当于进行了n-1,为啥还要n-1呢?...内循环结束边界是n-i-1,n-1容易理解,但是我们讲过了,每次都要再少1次循环,因为已经冒泡到最上面1个元素不需要再被比较,所以内循环使用了循环的变量i,使得个完整的内循环都比上次更少循环一次。 ​

    59520

    冒泡排序python实现_冒泡排序python代码优化

    一直重复这个过程,直到没有任何两个相邻的元素可以交换,就表明完成了排序。 一般情况下,称某个排序算法稳定,指的是当待排序序列中有相同的元素时,它们的相应位置排序后不会发生改变。...三、冒泡排序的实现代码(python) def mao_pao(num_list): num_len = len(num_list) # 控制循环的次数 for j in range(num_len):...# 添加标记位 用于优化(如果没有交换表示有序,结束循环) sign = False # 内循环每次将最大值放在最右边 for i in range(num_len - 1 - j): if a[i...] > a[i+1]: a[i], a[i+1] = a[i+1], a[i] sign = True # 如果没有交换说明列表已经有序,结束循环 if not sign: break if __name...– 有序度 有序度和逆序度的取值范围: 0 ~ n*(n-1)/2 二、冒泡排序过程: 冒泡排序过程包含两个操作,比较和交换,因为冒泡排序只会交换相邻的两个元素,所以,每进行一次交换,有序度就增加一

    64030

    基础算法(二)

    第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束倒数第二的位置上得到一个新的最大数...如此下去,重复以上过程,直至最终完成排序。   由于排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。   用二重循环实现,循环变量设为i,内循环变量设为j。...循环重复9次,内循环依次重复9,8,...,1次。...选择排序         原理:n个数的直接选择排序可经过n-1趟直接选择排序得到有序结果:         ①初始状态:无序区为R[1..n],有序区为空。         ...这样,n个数的直接选择排序可经过n-1趟直接选择排序得到有序结果。

    67900

    Java数据结构和算法(三)——冒泡、选择、插入排序算法

    冒泡排序解释:   冒泡排序是由两个for循环构成,第一个for循环的变量 i 表示总共需要多少轮比较,第二个for循环的变量 j 表示每轮参与比较的元素下标【0,1,.........,length-i】,因为每轮比较都会出现一个最大值放在最右边,所以每轮比较后的元素个数都会少一个,这也是为什么 j 的范围是逐渐减小的。相信大家理解之后快速写出一个冒泡排序并不难。...冒泡排序性能分析: 假设参与比较的数组元素个数为 N,则第一轮排序N-1 次比较,第二轮有 N-2 次,如此类推,这种序列的求和公式为:   (N-1)+(N-2)+...+1 = N*(N-1)...(2)步,直到排序结束 ?...插入排序性能分析:   第一轮排序中,它最多比较一次,第二轮最多比较两次,一次类推,第N轮,最多比较N-1次。因此有 1+2+3+...+N-1 = N*(N-1)/2。

    1.1K81

    常见算法之排序

    最好情况下,即原数组已经递增有序,这是每个内层 $for$ 循环刚进入即退出,只比较一次,而不移动元素,总的比较次数就是循环次数 $n-1$ 次,可知此时时间复杂度为 $O(n)$。...1$ 趟冒泡排序就已经排好序了,增加一个标志位 exchange 用于标识此趟($n-1$ 次循环中的某一次)排序是否发生了逆序和交换。...exchange) // 本趟排序未发生交换,则排序完成,算法结束 return; }} 复杂度分析 冒泡排序的外层for循环次数为 $n-1$,内层for的循环次数为 $...i$,可知内层循环的元素总比较次数为: $$1+2+…+(n-1)=\frac{n(n-1)}{2}=O(n^2)$$ 冒泡排序中,第 $i$ 趟排序需要执行 $n-i$ 次元素比较操作,但不是每次比较都会导致交换...另外还可证明平均情况下,冒泡排序的时间复杂度仍为 $O(n^2)$。 冒泡排序是一种稳定的排序算法。

    63820
    领券