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

循环排序:为什么最外层的循环运行(n-1)次

循环排序是一种常见的排序算法,其目的是将一个数组或列表中的元素按照一定的顺序进行排列。在循环排序中,最外层的循环运行(n-1)次的原因是为了确保所有的元素都能够被正确地排序。

循环排序的基本思想是通过比较相邻的元素并交换它们的位置,从而逐步将最大(或最小)的元素移动到数组的末尾。每一次循环都会将当前未排序部分的最大(或最小)元素放置到正确的位置上,因此最外层的循环需要运行(n-1)次,其中n表示数组或列表的长度。

在每一次循环中,内层的循环会比较相邻的两个元素,并根据排序的要求进行交换。通过这种方式,每一次循环都会将当前未排序部分的最大(或最小)元素移动到正确的位置上,同时减少了未排序部分的长度。因此,最外层的循环需要运行(n-1)次,以确保所有的元素都能够被正确地排序。

循环排序的优势在于其简单易实现,适用于小规模的数据集。然而,对于大规模的数据集,循环排序的效率相对较低,因为其时间复杂度为O(n^2)。在实际应用中,可以考虑使用其他更高效的排序算法,如快速排序、归并排序等。

对于循环排序的应用场景,可以包括但不限于以下几个方面:

  1. 小规模数据集的排序:循环排序适用于小规模的数据集,例如对几十个或几百个元素进行排序。
  2. 教学和学习用途:循环排序是一种简单易懂的排序算法,常用于教学和学习排序算法的基本原理和思想。
  3. 排序算法的比较和分析:循环排序可以作为其他排序算法的对比基准,用于评估其他排序算法的性能和效率。

腾讯云提供了多种与云计算相关的产品和服务,其中包括与排序算法相关的计算和存储服务。具体推荐的产品和产品介绍链接地址如下:

  1. 云服务器(ECS):提供弹性计算能力,可用于执行排序算法等计算任务。详情请参考:https://cloud.tencent.com/product/cvm
  2. 云数据库(CDB):提供高性能、可扩展的数据库服务,可用于存储排序算法中的数据。详情请参考:https://cloud.tencent.com/product/cdb
  3. 云函数(SCF):无服务器计算服务,可用于执行排序算法等计算任务。详情请参考:https://cloud.tencent.com/product/scf

请注意,以上推荐的腾讯云产品仅供参考,具体选择应根据实际需求和场景进行。

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

相关·内容

1.说说你不知道的时间复杂度

那么外面多了一层for循环,这次要循环多少次呢?(j * log2a)次 > 线性:O(n) 线性指的就是O(n),也就是运行n次。...外层循环执行n次,内层循环也是n次,所以最终执行n*n次,所以时间复杂度是O(n^2) } } } 这里有两层循环,外层循环执行n次,内存循环也是n次,所以代码...来找找它的规律 /* * 外层循环i=n, 内层代码执行1次 * 外层循环i=n-1,内层代码执行2次...* 外层循环i=n-2,内层代码执行3次 * 外层循环i=n-3,内层代码执行4次 * 外层循环i...我们来分析一下: 外层循环i=n, 内层代码执行1次 外层循环i=n-1,内层代码执行2次 外层循环i=n-2,内层代码执行3次 外层循环i=n-3,内层代码执行4次 外层循环i=1,内层代码执行

42310

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

冒泡排序性能分析: 假设参与比较的数组元素个数为 N,则第一轮排序有 N-1 次比较,第二轮有 N-2 次,如此类推,这种序列的求和公式为:   (N-1)+(N-2)+...+1 = N*(N-1)...其实无论何时,只要看见一个循环嵌套在另一个循环中,我们都可以怀疑这个算法的运行时间为 O(N2)级,外层循环执行 N 次,内层循环对每一次外层循环都执行N次(或者几分之N次)。...选择排序性能分析: 选择排序和冒泡排序执行了相同次数的比较:N*(N-1)/2,但是至多只进行了N次交换。   ...插入排序性能分析:   在第一轮排序中,它最多比较一次,第二轮最多比较两次,一次类推,第N轮,最多比较N-1次。因此有 1+2+3+...+N-1 = N*(N-1)/2。   ...一般不会选择冒泡排序,虽然冒泡排序书写是最简单的,但是平均性能是没有选择排序和插入排序好的。   选择排序把交换次数降低到最低,但是比较次数还是挺大的。

1.1K81
  • 初级排序算法

    太多的库函数为我们实现了排序的过程,其中的算法可能也会比今天谈到的排序算法高效的多,简单的调用,这种高效便为我们提供了服务,但今天我们为什么还要提及这些算法呢?...array[min] = array[i]; array[i] = temp; } } } 最外的for循环,确定了一个界限i。...但为之付出的代价也是巨大的,选择的过程会花费很长时间(与其他排序算法相比)。为了找到最小的元素,i之后的元素会一个一个进行比较,从而选出最小的元素。每一次扫描也不会给下一次扫描提供任何有用的信息。...于是,对于选择排序来说,对一个大小为N的有序序列和一个大小为N的无序序列进行排序所花费的时间是一样的,运行时间和输入无关。我们在以后的文章中将会看到,其他算法更善于利用输入的初始状态。...for循环,将i从0移动到N-1,并且保证array[i]左侧的元素都已经有序,但每个元素可能并不是在最终的位置(可能还会被array[i]之后的元素插来插去)。

    37330

    go语言十大排序算法总结

    选择排序 选择排序的基本思想是对待排序的记录序列进行n-1遍的处理,第i遍处理是将L[i..n]中最小者与L[i]交换位置。这样,经过i遍处理之后,前i个记录的位置已经是正确的了。...为什么叫选择排序呢,估计就是这个原因,每次遍历一遍,选个最大或者最小的出来。算法因此得名。...冒泡排序 冒泡排序方法是最简单的排序方法。这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。...算法时间复杂度是O(n ^2) 个人总结: 在处理第二次循环的边界问题上,防止数据越界。为了保证已经冒泡到最顶端的数据不被第二次查询比较,需要在最内层循环和外层循环分别做限制。...外层循环用来控制比较的次数,内层循环用来在每次遍历数组元素并作比较,所以外层需要靠内层的结果作为次数限制,内层的哪部分数据需要比较,需要外层的纪录做动态变更。

    70650

    go语言十大排序算法总结

    选择排序 选择排序的基本思想是对待排序的记录序列进行n-1遍的处理,第i遍处理是将L[i..n]中最小者与L[i]交换位置。这样,经过i遍处理之后,前i个记录的位置已经是正确的了。...为什么叫选择排序呢,估计就是这个原因,每次遍历一遍,选个最大或者最小的出来。算法因此得名。...冒泡排序 冒泡排序方法是最简单的排序方法。这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。...算法时间复杂度是O(n ^2) 个人总结: 在处理第二次循环的边界问题上,防止数据越界。为了保证已经冒泡到最顶端的数据不被第二次查询比较,需要在最内层循环和外层循环分别做限制。...外层循环用来控制比较的次数,内层循环用来在每次遍历数组元素并作比较,所以外层需要靠内层的结果作为次数限制,内层的哪部分数据需要比较,需要外层的纪录做动态变更。

    75880

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

    即对于内层循环: 在第i趟排序中,只需要比较n-i次(i从1开始)。 如果外层循环是从0开始计数的,那么需要每轮需要比较n-1-i次。...---- 对于外层循环,在执行第n-1趟排序时,内层循环只比较了第1个元素和第2个元素。 此时已经排列完成,不需要再执行下一趟排序。 即对于外层循环: 只需要排序n-1趟。...对于给定的数组,n-1的结果也是确定的。因此无论外层循环的计数器从几开始,需要比较的次数都是n-1。 上面的例子比较简单,还有一种情况存在优化空间:在第n-1趟排序执行之前就已经排序完成。...Java中Boolean类型不能赋值为1或0,将对应的1和0改为true和false即可。 总结 外层循环控制轮数,总共执行n-1轮。 内层循环控制每轮的比较次数,第i轮比较n-i次(i从1开始)。...,外层循环执行的趟数都为n-1,n即元素个数。

    20730

    排序算法之插入排序

    针对外部循环的循环不定式为 在第一步循环的每次迭代开始时,子数组A[0…i-1]包含初始元素A[0…i-1],但此时是已经排好序的。 插入排序动图演示 ?...插入排序的运行时间: 分析插入排序的运行时间,我们发现它比选择排序更复杂,选择排序的内层循环取决于外层循环的索引而非元素的值,而插入排序内层循环的迭代次数取决于外层循环的索引i和数组元素值。...当且仅当程序开始时,数组已经是有序的,在这种情况下,外层迭代n-1次,每次迭代花费常量时间,所以时间复杂度是O(N)。...外层循环每次迭代花费常量时间,迭代n-1次,内层循环每次迭代也花费常量时间,迭代i-1次。因此最坏情况下时间复杂度为O(n2)。 选择排序与插入排序的优缺点: 当数组基本有序时,插入排序更好些。...选择排序的优点在于每次移动的次数是固定的,而插入排序最坏情况下移动的次数可能会达到n2次。所以,如果无法确定插入排序的输入是否接近于最好情况,最好运行选择排序。

    39930

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

    循环,内层变量为i, 外层为j,在内层循环中不断的比较相邻的两个值(i, i+1)的大小,如果i+1的值大于i的值,交换两者位置,每循环一次,外层的j增加1,等到j等于n-1的时候,结束循环 第一次看不懂很正常...,我们来分析一下 第一次循环: j = 0, i~n-2 range(0, n-1) 第二次循环: j = 1, i~n-3 range(0, n-1-1) 第三次循环: j = 2, i~n-4 range...count,如果第一次循环后count没有变化,就说明输入的是有序序列,这时我们直接return退出循环,这时候的时间复杂度为O(n) 扩展知识:冒泡排序还是一种稳定性的算法,如果序列中出现两个相同的值的时候...,n个数为n-1次 for i in range(0,len(number)-1): #内循环控制每次排序对比的次数,n个数对比n-1次 for j in range(0,len(number)-1):...是1里面的代码循环直到把fish_records里最大的数排在最后一位然后再运行2吗?也就是[8,7,2,3,6,1,1,18]。。。为什么1里不是[8,18,7,2,3,6,1,1]再运行2 ?

    1.1K10

    排序算法

    1:冒泡排序 --- 冒泡排序是的算法思路是将最小数值放在下标为0的位置,将最大值放在mao.length-1的位置 外层for循环开始计算层数,即mao.length-1为目标计划循环次数,当外层for...冒泡排序的效率 在上面的例子结果中可以看出,7条数据的情况下,第一趟循环比较了6次,第二次比较了5次......,最后一次比较一次,公式为 (N-1)+(N-2)+(N-3)+...+1===N*(N-1)/==2==== 比较算法结果: 学过高数的人都知道,数学中有叫趋向于某某某的说法,咱们的算法比较结果就是趋向于...在平常的代码中,如果那你看到双重for循环时,基本就可以判断运行时间效果为O(N²)了。...所以时间为N²/2 比较次数和交换次数 比较次数:N²/2 交换次数:最多N-1,最少0次,取平均N/2 大O表示法 O(N²) 以上可看出选择排序是比冒泡排序快点的。

    75150

    【干货】史上最好的排序和数据结构入门

    因为俩俩交换,需要n-1趟排序(比如10个数,需要9趟排序) 代码实现要点:两个for循环,外层循环控制排序的趟数,内层循环控制比较的次数。每趟过后,比较的次数都应该要减1 ?...当只有一个数时,则不需要选择了,因此需要n-1趟排序 代码实现要点:两个for循环,外层循环控制排序的趟数,内层循环找到当前趟数的最大值,随后与当前趟数组最后的一位元素交换 ?...当只有一个数时,则不需要插入了,因此需要n-1趟排序 代码实现:一个for循环内嵌一个while循环实现,外层for循环控制需要排序的趟数,while循环找到合适的插入位置(并且插入的位置不能小于0)...将个位、十位、…分配到桶子上,每分配一次就回收一次 ? 递归 递归在算法里边用得非常非常多,排序算法的快速排序和归并排序就需要用到递归(至少用递归来实现是最方便的)。...现在已经工作有一段时间了,为什么还来写最基础的算法和数据结构呢,原因有以下几个: 我是一个对排版有追求的人,如果早期关注我的同学可能会发现,我的GitHub、文章导航的read.me会经常更换。

    56820

    C#中基础排序算法

    冒泡排序算法的逻辑如下 : //添加到CArray类的冒泡排序函数 public void BubbleSort() { int temp; //最外层循环, 从最后一个元素开始,...然后, 将最小的元素放置在第 0 个位置上, 接着再从第1 个位置开始重复以上操作, 一直到第N-1个元素完成这种选择排序后才终止. 。 在选择排序算法中使用了两层循环....外层循环从数组的第一个元素移动到数组第N-1个元素, 而内层循环则从数组的第二个元素移动到数组的最后一个元素, 并且内循环遍历一遍之后, 就会把找到的最小值赋值到本轮内循环最开始的索引位置上....外层循环会逐个遍历数组元素, 而内层循环则会把外层循环所选择的元素与该元素在数组内的上一个元素进行比较....如果外层循环选择的元素小于内层循环选择的元素, 那么数组元素都向右移以便为内层循环元素留出位置, 这就像前面例子描述的那样. 现在就来看看选择排序是如何处理前面实例中用来排序的数据集合的.

    76120

    四种简单的排序算法

    假设数组长度为n,外层循环控制变量i由1至n-1依次递进,用于选择当前处理哪条记录;里层循环控制变量j,初始值为i,并由i至1递减,与上一记录进行对比,决定将该元素插入到哪一个位置。...它也含有两层循环,假设数组长度为n,外层循环控制变量i由0到n-2递增,这个外层循环并不是处理某个记录,只是控制比较的趟数,由0到n-2,一共比较n-1趟。为什么n个记录只需要比较n-1趟?...我们可以先看下最简单的两个数排序:比如4和3,我们只要比较一趟,就可以得出3、4。对于更多的记录可以类推。 数组记录的交换由里层循环来完成,控制变量j初始值为n-1(数组下标),一直递减到1。...我们来对它进行一个考察,按照这种排序方式,在进行完第一趟循环之后,最小的一定位于数组最顶部(下标为0);第二趟循环之后,次小的记录位于数组第二(下标为1)的位置;依次类推,第n-1趟循环之后,第n-1小的记录位于数组第...选择排序的思路是:对于第一趟,搜索整个数组,寻找出最小的,然后放置在数组的0号位置;对于第二趟,搜索数组的n-1个记录,寻找出最小的(对于整个数组来说则是次小的),然后放置到数组的第1号位置。

    61520

    《算法日记-玩出新花样》- 两数求和的三种解法

    ,你会发现它们的区别主要是在第二层的 for (int j = i + 1; j 的含义主要是:每轮都将最外层之前比较过的元素筛选出去,不再进行重复比较...比如要循环一个数组【1、2、11、7】找出和为9的两个元素下标,我们会进行如下的操作:   1、第一轮循环外层会使用【1】和内层中【2,、11、7】做运算,但没找有符合条件的两个元素,继续循环。...2、第二次外层循环拿2和内层中的【11,7】做元素,得到符合条件的结果,如果没有,则以此类推继续进行第三轮、第四轮...的操作。   ...1次、n-2次,n-3次...等等,你是不是已经发现,内层循环的比较次数就是一个等差数列,公差为1**(注:如果对等差数列不是很熟悉的同学,可以直接百度下,几分钟就能掌握)   通过等差数列的求和方式...:Sn=na1+n(n-1)d/2,我们可以得到耗费运行时间的函数f(n) = na1+n(n-1)d/2,再根据大O记法的推断,可以得出优化后的方法时间复杂度为O(n^2)。

    38530

    数据结构|冒泡排序与选择排序

    冒泡排序 排序算法可以说是算法中使用的比较频繁的,冒泡排序是一种简单的排序,它通过遍历,一次比较两个元素,如果排序错误就交换位置,遍历需要重复进行直到不再需要交换,才算排序完成。...第一层(内层循环):每次将相邻的两个元素进行对比,使最大值移动到列表尾部 第二层(外层循环):第一层循环,第一次执行只能保证最后一位的元素位置正确,第二次保证倒数第二位的位置正确,以此类推,需要执行N-...1次第一层循环,这就需要一个外层循环来实现。...随着元素个数的变化,外层循环和内存循环的次数都在变化,我们就需要将外层循环和内存循环的循环次数联系在一起。...外层循环执行次数外层循环内层循环第一次J=0需要执行n-1次第二次J=1需要执行n-1-1次第三次J=2需要执行n-1-2次。。。。。。 ?

    52120

    【排序算法】八大排序(上)(c语言实现)(附源码)

    ++)//每一趟排序使一个元素就位,n个元素的数组需要n-1趟排序(最后一趟会使前两个元素就位) { //内层循环控制需要比较的相邻元素 for (int j = 0; j 排序使一个元素就位,n个元素的数组需要n-1趟排序(最后一趟会使前两个元素就位) { int flag = 1;//假设数组已经有序 //内层循环控制需要比较的相邻元素 for.../将最小值与遍历部分的首元素交换 } } 运行测试: 选择排序特性总结 空间复杂度:O(1) 时间复杂度:O(N^2) 稳定性:不稳定 使用寻找最值进行交换的方式,虽然在效率上相比冒泡排序有所提升...n-1趟排序(最后一趟会使前两个元素就位) { int flag = 1;//假设数组已经有序 //内层循环控制需要比较的相邻元素 for (int j = 0; j 循环 { break; } } } //选择排序 void SelectSort(int* arr, int n) { //外层循环控制遍历次数以及遍历的起始位置 for

    20310

    【初阶数据结构篇】插入、希尔、选择、堆排序

    数据进行插入时,会将其与前面i个数据比较i次,总比较次数即1+2+3+……(n-1),O(n^2) 最好情况:数组升序排列 当我们对下标为i(0的tmp数据进行插入时,只会与其前面一个数据比较一次...每一次排序我们排的是end和end+gap(即tmp)处的元素,保证每次排序都是在同一组内排 end初始为0可得tmp初始为gap,tmp末态为n-1可得end末态为n-1-gap 。...: 外层循环: 外层循环的时间复杂度可以直接给出为:或者,即 O(log n) 2 O(log n) 3 O(logn) 内层循环: 假设⼀共有n个数据,合计gap组,则每组为n/gap个;在每组中,插...选择排序 2.1 直接选择排序 选择排序的基本思想: 每⼀次从待排序的数据元素中选出最⼩(或最⼤)的⼀个元素,存放在序列的起始位置,直到全部待 排序的数据元素排完。 2.1.1分析 1....在元素集合 array[i]--array[n-1] 中选择关键码最⼤(⼩)的数据元素 2. 若它不是这组元素中的最后⼀个(第⼀个)元素,则将它与这组元素中的最后⼀个(第⼀个)元素 交换 3.

    6610

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

    我们可以总结下,N个数字要排序完成,总共进行N-1趟排序,第i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数。...2.第二次从第二数个开始,遍历N-1个数,找出最小的数与第二个数交换。 如此循环...... 3.直到进行第N-1次遍历,比较最后2个数,判断是否要交换。排序完成。...第N-1次排序,需要比较1次; 比较次数=(N-1)+(N-2)+...+1=((1+ N-1)*(N-1))/2=N²/2 + N/2 所以时间复杂度为:O(N²) 三、区别 一、相同点 1.都有两层循环...,外层循环控制比较的轮数,和数组元素的个数有关。...内层循环控制需要参与比较的元素个数,和外层循环的轮数有关,最终比较的次数是一样的。 2.两种算法进行交换的结构是相同的。

    61350

    选择排序

    选择排序 选择排序是冒泡排序的升级版 基本原理 每次排序(互换位置)前,先从没排序的数列里面选出最小值,然后再把选中的最小值和目标值交换位置 比如,第一次排序,所有元素(n)都是未排序的,就在所有元素里选出最小值...,然后将这个最小值和第一个位置互换,然后第二次在剩余的元素(n-1)里先选出最小值(也就是全部元素(n)的第二小值),然后把最小值和第而个值互换位置,......以此类推,知道找到第n-1个元素和n互换位置后...复杂度 最好复杂度O(n²) 最差复杂度O(n²) 因为选择排序是每次先找出一个最值,然后再进行互换位置,虽然比较次数还是O(n²),但是交换次数由O(n²)减到O(n) 稳定性 稳定算法,所有相同元素相对位置都不变...- 1 - 0次,即5次 // 第二轮内层循环arr.length - 1 - 1次,即4次 // 第三轮内层循环arr.length - 1 - 2次,即3次 // 第四轮内层循环arr.length...(arr) { for (var j = 0; j < arr.length; j++) { // 记录最小值的下标(且每次外层for循环重新修改查找范围(越来越小))

    31220

    C语言中你必须知道的几大排序算法

    当外层for循环的每轮选择循环体执行完毕后,i 下标的元素就是所有剩余元素中的最小值。当for外层循环执行完毕后,排序完成,输出排序后的数组元素。...外层for循环用来表示排序的轮数,内层for循环对当前某轮剩余未排序元素进行冒泡排序。...:完成排序 和 未完成排序 外层for循环用来表示排序的轮数,内层for循环对当前某轮剩余未排序元素进行交换排序。...每轮排序都将当前未排序元素中的最小值元素交换出来,放在已排序元素的最后,当执行N-1轮之后,所有的元素都完成了排序。 当整个循环结束后,输出排序后的数组。...选择法排序 共需要进行n(n-1)/2次比较,互相交换n-1 次。选择法排序简单、容易实现,适用于数量较小的排序,但它是不稳定的排序算法,也就是说,对应有相同关键字的记录,排序后可能会颠倒次序。

    82200

    我说我不会算法,阿里把我挂了。

    因为俩俩交换,需要n-1趟排序(比如10个数,需要9趟排序) 代码实现要点:两个for循环,外层循环控制排序的趟数,内层循环控制比较的次数。...当只有一个数时,则不需要选择了,因此需要n-1趟排序 代码实现要点:两个for循环,外层循环控制排序的趟数,内层循环找到当前趟数的最大值,随后与当前趟数组最后的一位元素交换 插入排序 思路:将一个元素插入到已有序的数组中...当只有一个数时,则不需要插入了,因此需要n-1趟排序 代码实现:一个for循环内嵌一个while循环实现,外层for循环控制需要排序的趟数,while循环找到合适的插入位置(并且插入的位置不能小于0)...基数排序(桶排序) 思路:基数排序(桶排序):将数字切割成个、十、百、千位放入到不同的桶子里,放一次就按桶子顺序回收一次,直至最大位数的数字放完~那么该数组就有序了 代码实现:先找到数组的最大值,然后根据最大值...将个位、十位、…分配到桶子上,每分配一次就回收一次 递归 递归在算法里边用得非常非常多,排序算法的快速排序和归并排序就需要用到递归(至少用递归来实现是最方便的)。

    28320
    领券