【排序】冒泡排序算法

特别说明:

对于算法,重在理解其思想、解决问题的方法,思路。因此,以下内容全都假定待排序序列的存储结构为:顺序存储结构。

冒泡排序思想

冒泡排序与插入排序、简单选择排序一样,都是比较简单的一类排序算法。假设待排序序列为 ,则冒泡排序算法思想如下:

01.设置  =  - 1 (注:0     - 1, 用于标记外层循环迭代);

02.如果  = 0,则排序结束,退出;

03.设置  = 0 (注:0     用于标记内层循环迭代);

04.如果  = ,跳转并执行 09 步骤 (即:该趟冒泡排序的内循环操作结束);

05.比较  与 

06.如果   ,则交换  与 

07.设置  =  + 1,跳转并执行 04 步骤;

08.设置  =  + 1,跳转并执行 02 步骤 (即:进入下一趟冒泡排序处理);

冒泡排序分析

冒泡排序是比较简单的一类排序算法,其时间复杂度为 ,空间复杂度为 ,该算法是属于交换类别的排序算法。与直接插入排序算法类似,如果待排序的序列在已经有序(或者基本有序)的情况下,冒泡排序是可以通过优化(或称之为改进,可能更为适合),其时间复杂度是有可能达到  的,具体做法是在一趟冒泡处理过程中,用一个标记设置在该趟处理过程中,第一个产生交换的元素位置,则在下一趟冒泡处理过程中,即可直接从该位置开始。因为该位置之前没有交换,则说明它们已经是有序的,故不需要对这些元素做冒泡排序处理 (具体可见下面编码实现参考)。

冒泡排序实现

下面是经过改进后的冒泡排序算法编码实现 (仅供参考):

 1 //
 2 // summary     : 冒泡排序.(带优化游标的版本)
 3 // in param    : seqlist 待排序列表.同时也是排完序列表.
 4 // in param    : nLen 列表长度
 5 // out param   : --
 6 // return      : --
 7 // !!!note       : 01.以下实现均假设一切输入数据都合法.即:内部不对参数全法性进行校验,默认它们全都合法有效.
 8 //               02.排序开始前 seqlist 是无序的,排序结束后 seqlist 是有序的.
 9 void bubble_sort(int seqlist[/*nLen*/], const int nLen) {
10     auto nInnerIdx = 0;
11     auto nFlag     = 0;
12     auto nOuterIdx = nLen - 1;
13     for (auto nOuterIdx = nLen - 1; nOuterIdx > 0; nOuterIdx = nFlag) {
14         for (nFlag = 0, nInnerIdx = 0; nInnerIdx < nOuterIdx; ++nInnerIdx) {
15             if (seqlist[nInnerIdx] > seqlist[nInnerIdx + 1]) {
16                 swapTwoItems(seqlist, nInnerIdx, nInnerIdx + 1);
17                 nFlag = nInnerIdx;
18             }
19         }
20     }
21 }

冒泡排序算法C++编码参考

时间: 2024-10-22 10:28:51

【排序】冒泡排序算法的相关文章

数据结构——排序——冒泡排序算法

冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. 冒泡排序对n个项目需要O(n2)的比较次数,且可以原地排序.尽管这个算法是最简单了解和实作的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的. 冒泡排序是与插入排序拥有相等的执行时间,但是两种法在需要的交换次

算法大神之路----排序(冒泡排序法)

冒泡排序法 冒泡排序法又称为交换排序法,是由观察水中冒泡变化构思而成,气泡随着水深压力而改变.气泡在水底时,水压最大,气泡最小,而气泡慢慢浮上水面时,气泡所受压力最小,体积慢慢变大. 冒泡排序比较方式是从第一个元素开始,比较相邻的元素大小,如果大小顺序有误,则对调后进行下一个元素比较.直到所有元素满足关系为止. 冒泡排序法分析 冒泡排序法平均情况下,需要比较(n-1)/2次,时间复杂度为O(n2),最好的情况只需要扫描一次,不用操作,即作n-1次比较,时间复杂度为O(n). 由于冒泡排序为相邻两

一个名声不好的排序算法(二)——冒泡排序算法

转载请注明出处,谢谢! 冒泡排序算法思想: 自下而上(或上而下)扫描记录序列,相邻的两条记录Ri与Ri-1(或Ri+1)如果是逆序,则交换位置. 交换排序 冒泡排序 快速排序 算法说明 一个名声不太好的算法 排序是稳定的 ArrayList实现: import java.util.ArrayList; import java.util.Random; public class Bubble { public static void sort(ArrayList<Integer> al) { i

冒泡排序算法和简单选择排序算法的js实现

之前已经介绍过冒泡排序算法和简单选择排序算法和原理,现在有Js实现. 冒泡排序算法 let dat=[5, 8, 10, 3, 2, 18, 17, 9]; function bubbleSort(data) { for(let i=0;i<data.length-1;i++){ for(let j=0;j<data.length-1-i;j++){ if(data[j]>data[j+1]){ [data[j],data[j+1]]=[data[j+1],data[j]]; } } }

冒泡排序以及冒牌排序优化算法

冒泡排序是最常用的排序算法,在笔试中也非常常见,能手写出冒泡排序算法可以说是基本的素养. 算法重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,这样越大的元素会经由交换慢慢“浮”到数列的顶端. 时间复杂度 算法稳定性 冒泡排序就是把小的元素往前调或者把大的元素往后调.比较是相邻的两个元素比较,交换也发生在这两个元素之间.所以,如果两个元素相等,是不会再交换的:如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺

冒泡排序算法的JavaScript实现

作为经典的排序算法之一,冒泡排序在JavaScript中也有多种实现方式. 在一些最常见的实现中会声明临时变量,在另一些不必声明临时变量的实现中则可能只支持数值数组或字符串数组(二者之一). 下面介绍两种[无须声明临时变量],[对数值数组和字符串数组都适用]的实现方式. ES5版: var arr = [5, 25, 2, 53, 22, 10]; function bubbleSort(arr) { for (var j = 1, len = arr.length; j < len; j++)

冒泡排序算法

冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. 本文地址:http://www.cnblogs.com/archimedes/p/bubble-sort-algorithm.html,转载请注明源地址. 冒泡排序对n个项目需要O(n2)的比较次数,且可以原地排序.尽

冒泡排序算法可视化

在百度前端技术学院的任务列表那里看到了有一个任务是要求用javascript实现可视化的排序算法,感觉很有趣,就稍微研究了一下,本来是想实现冒泡排序算法和快速排序算法的可视化的,可是快速排序在要如何实现可视化这一步上感觉有一点难度,于是就暂时放弃了. 冒泡排序原理 冒泡排序我们应该都不陌生吧?很简单的两个for循环就可以实现了,其基本原理是:在一开始的时候,比较第一第二个数,如果如果第一个数比第二个数大的话则交换二者位置,在比较第二个和第三个数,同样的如果第二个数比第三个数大的话,则交换二者位置

图文并茂排序与算法

图文并茂排序与算法总结 转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5094764.html 总结下常用的排序算法,方便以后查阅. 常见排序算法:冒泡排序.选择排序.插入排序.壳(shell)排序.合并排序.快速排序.堆排序. 要选择合适的算法,需考虑的因素:执行时间.存储空间和编程工作. 1.选择排序 具有二次方程增长阶,近适用于小列表排序. 通过列表反复扫描,每次扫描选择一项,然后将这一项移动到列表中正确的位置. 选择排序总比较次数=(n-1)+(