冒泡排序的个人理解

去新松面试笔试题中最后一道是冒泡排序,看到这题先是兴奋后是悲哀。

兴奋的是这么简单啊,上大学时整的老明白了,考试的时候也为数不多的自己答的题。

悲哀的是毕业后就再也没用过,全都就饭吃了。。。

想想看我最有文化的时候应该就是高三了,但是当年的数理化知识现在还记得多少?

花了一个小时恶补了一下,唉!这学习能力赶上老年人了。

下面说正事,区区几行代码信息量还不少。

int a[10] = {9,8,7,6,5,4,3,2,1,0};

bool bIsSwap = true;//判断后面的序列是否已经有序

for (int i=0;i<10-1 && bIsSwap;i++)
{
bIsSwap = false;//如果在第二个循环中一次也没有进行交换则数组中i后面的已经是有序的了不需要再运行。

for (int j=10-1;j>i;j--)//如果i=0,j=9第二个循环就会比较9次,就是说j的循环次数始终是数组中剩下的无序数的数量减1。
{
if (a[j-1] > a[j])//如果前一个数比后一个大则交换数据,也就是冒了一次泡。
{
int iData = a[j];
a[j] = a[j-1];
a[j-1] = iData;

bIsSwap = true;
}
}
}

这里i只起到控制循环的作用,并没有用来操作数组。外面的循环每运行一次都会从数组中剩下的没排好序的序列中找出一个最小值。
比如第一次循环一定能找出数组中最小值,第二次循环一定能找出数组中第二小的值如此反复。
所以i可以被当作一个flag,标记当前正在查找数组中第几小的数,里面的循环中j>i就起这个作用。

因为有数组中有10个数,这样外面的循环只需要循环9次就能找出数组中最小的9个数并排好序。

在里面的循环中,每次j都从数组的最后端向前端查找,在查找的过程中会“顺带”的把数组中剩下的较小的值向上提升,这就比j从大到小查找更有效率。

我这个例子比较极端是完全逆序的数组,如果不是完全逆序就更容易看出。

比如int a[10] = {9,0,8,7,6,2,5,4,3,1};

第一次循环时会把1"提升"到现在的9后面,数组变成 {0,9,1,8,7,6,2,5,4,3}如果第二个循环写成for (j=i+1;j<=10;j++)

则外面的循环在第二次循环时会将2换到现在1的位置,也就是数组的最后,数组变成{0,1,9,8,7,6,5,4,3,2},这样就增加了比较次数。

时间: 2024-12-25 18:34:13

冒泡排序的个人理解的相关文章

详解JavaScript冒泡排序

相信接触过编程语言的同学们都会对冒泡排序不陌生,今天我为大家分享一下冒泡排序的一些实现等等 注:冒泡排序为我个人理解如若有不同意见的同学欢迎讨论 首先介绍一下楼主的思路: 假如现在有以下一个数组 楼主的思路是:用第一个数去比对其他所有的数,假定从小到大进行排序,那么我使用第一个数也就是 下标为0的数字45去与其他数85,65等等比较 从小到大那么下标为0的元素应该是数组中的最小值 所以当我们进行比较的时候我们通过判断大于的方式如果大于那么就交换位置就是说假如 45>85那么使用第三个变量进行交换

C++中sort()及qsort() (不完整介绍)

在平时刷算法题和oj的时候,排序算法是最经常用到的算法之一:且在各类算法书的目录中 也通常是将各种排序算法放在最前面来讲,可见排序算法的重要性.可能许多人都在算法书中有学过冒泡.快速排序的方法,也都大致了解其原理:实际应用时,冒泡排序是最为简单的,当然复杂度也是最高的.....(就如高德纳所说:"冒泡排序除了它迷人的名字和导致了某些有趣的理论问题这一事实之外,似乎没有什么值得推荐的"):快排在理想情况下可以说是最高效的了(nlogn).但快速排序并不像冒泡排序那样好理解和记忆,每次都需

我的算法练习

绪论:算法在计算机中基本上是通用的,只不过不同的语言表现的方式有差别. 1.集合类型数据用特定字符拼接为一个字符串 var str:String = ""; var arr:Array = [1,2,3,5,3,2]; var sep:String = ";"; for(var i:int = 0;i < arr.length; i++) { var n:int = arr[i]; if(i < arr.length - 1)//前arr.length

C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆)

C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆) 虽然直接插入排序,冒泡排序以及二分查找是算法中最为基础以及老掉牙的话题,但作为一名算法的深爱者,有时候无聊时候总会将这些简单的话题重新理解并敲写一番,目的只是为了得到理解娴熟的程度.而且,我觉得越是简单基础的东西,有时候更应该反复的去敲写,深化它,并最终让其中的思想内化为自己的一部分.待到他日一提起之时,会相当娴熟的"刷刷刷..."几分钟搞定,那就很有成就感了! 因为我喜欢对于一个问题进行实例的剖析,进而再转化为特有的用某种

用链表写的冒泡排序理解

这是一位师弟问的问题,一段用链表写的冒泡排序. [1] 为什么要多用一个空的表头? 这是由链表结构造成的,如果要交换p1和p2两个节点,则需要p1的前趋的指针,举例,设原链表为{3,2,1}如果我们要交换3和2,由于3是表头节点,所以需要一个指向3的指针节点,因此这里我们设置了一个空的头节点p1,第一个元素的位置实际上在head->next上. [2] 释放指针方式解读 delete p; p=NULL; 最后要释放掉这个空的头节点,先保存下这个地址p1=head,实际表的地址指回原来的位置(h

冒泡排序深入理解

冒泡排序深入理解 对于冒泡排序有一个小性质: 每一次都会把序列未排好序的最大数"沉底", 即推到序列尾部 1.P4378 Out of Sorts S 留意着农场之外的长期职业生涯的可能性,奶牛Bessie开始在不同的在线编程网站上学习算法. 她到目前为止最喜欢的算法是"冒泡排序".这是Bessie的对长度为N的数组A进行排序的奶牛码实现. sorted = false while (not sorted): sorted = true moo for i = 0

冒泡排序的理解

每次准备面试,都要看下冒泡算法,因为不会!工作三年多,这个算法算个试题吧,每次死记硬背,却没有理解,悲哀啊,其实也没多复杂,代码几行,第一个循环,代表比较次数,多少个数,就比较多少次-1,int i=0;i<a.length-1;i++这个是控制循环的.从第一个数开始比,比较几次呢,假如两个数,比较一次,假如三个数,二次,规律是减一,第二个循环,控制指针,从第几个数开始比,先看语法int j=0:j<a.length-1-i;j++,第一次循环.把第一个数和后面每一个数比较,第二次循环,把第二

有关快速排序和冒泡排序的理解

冒泡排序:将第一位的值与后面所有的值比较,碰到小的就与其交换,第一次循环得到最小的数,再对后面的数循环,得到最小的数,依次下去,复杂度为o(n*n): 快速排序:将第一位的值与后面的值比较,得到这个值在数组中的准确位置,第一次循环与冒泡排序的复杂度式一样的,都是n,可循环之后把数组分为两个数组,继续对两个数组排序.复杂度为log2(n)*n~n*n. 那么为什快速排序会比冒泡排序快呢? 本质原因是快速排序将每一步比较的信息都利用了,而快速排序则丢失了一些比较的信息.为将两种排序类比为一个全国打架

对冒泡排序的理解和实例

Java冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 冒泡排序算法的运作如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有