《冒泡排序》算法设计之二

冒泡排序过程

1.首先比较相邻的两个元素,如果前面数据大于后面数据的话,就将这两个数进行交换,依次推,直到完成第N-1个记录与第N个记录交换为止(第一趟起泡)。

2.然后再进行第二趟气泡。由第一趟气泡,可知末尾是最大数,所以第二趟之比较前N-1个数

3.第三趟……   比较N-2个数

...................................................................................

冒泡分析

通过上述的过程分析,可以知道冒泡就好比一个倒置的三角形。

 第一次气泡,比较N次

第二次气泡,比较N-1次

.....................

如图三角形所示

代码分析

由上面分析的冒泡过程,我们在代码实现上也就简单多了。

1.有一个前后两个数交换的过程。

2.有一个交换次数递减的过程

代码实现

<span style="font-family:SimSun;font-size:18px;">  /// <summary>
        /// 冒泡排序法实现过程
        /// </summary>
        /// <param name="a">数组a用来保存要排序的数字</param>
        /// <param name="n">数组元素的个数</param>
       void BubbleSort(int[] a, int n)
        {
            int i,j,c;

          //外层循环,用来辅助,每次递减的次数
            for(i=0;i<n;i++)

            {
                //里层循环用来做前后两个数的交换
                for(j=1;j<n-i;j++)
                {
                  //两个数交换的过程
                    if(a[j-1]>a[j])

                    {
                        //引入第三者,做辅助
                        c = a[j - 1];
                        a[j - 1] = a[j];
                        a[j] = c;
                    }

                }

            }
        }</span>

代码分析,上面的代码也可以做优化,因为如果在一次循环过程中,都没有经过交换的话,那么我们可以知道,此次排序就已经完成了,就不用接着在进行比较判断了,因此我们可以设置一个标志位,来进行判断。

<span style="font-family:SimSun;font-size:18px;"> static void BubbleSort(int[] a, int n)
        {
            int i,j,c;
            bool flag;
          //外层循环,用来辅助,每次递减的次数
            for(i=0;i<n;i++)

            {
                flag = false;//设置一个标志位,默认值为false
                //里层循环用来做前后两个数的交换
                for(j=1;j<n-i;j++)
                {
                  //两个数交换的过程
                    if(a[j-1]>a[j])

                    {
                        //引入第三者,做辅助
                        c = a[j - 1];
                        a[j - 1] = a[j];
                        a[j] = c;
                        flag = true;  //如果发生交换的话,标志位就为true
                    }

                }
                //在此来判断标志位,如果为false的话,证明没有进行交换,因此就已经排序好了,可以直接停止过程了
                if (!flag) break; 

            }
        }</span>

如果明白了冒泡排序的本质后,对于代码也就好实现的多了,要记住上述倒置的三角形,明白两点。

1.比较次数在较少

2.前后做比较

因此上述的代码我们也可以用while语句写,其实都是一样的

<span style="font-family:SimSun;font-size:18px;"> //优化后的冒泡算法
        static void BubbleSort2(int []a,int n)
        {
            int j;
            bool flag;
            int c;
            //标志位
            flag =true ;
            while(flag)
            {
                flag =false ;
                for(j=1;j<n;j++)
                {
                    if(a[j-1]>a[j])
                    {
                        c = a[j - 1];
                        a[j - 1] = a[j];
                        a[j] = c;
                        flag = true;
                    }
                }

                //次数递减
                n--;

            }
        }</span>

学习心得

网上这种排序的代码很多,只要你能够理解本质,应用起来也就不费事了。但是理解本质的前提是需要做大量的写写画画的操作。别人的东西,永远是别人的,所以我们要通过研究来化为己有,能够做到为我所用。

时间: 2024-07-31 15:40:28

《冒泡排序》算法设计之二的相关文章

五种常用的算法设计技巧之二:分治算法

一,介绍 分治算法主要包含两个步骤:分.治.分,就是递归地将原问题分解成小问题:治则是:在解决了各个小问题之后(各个击破之后)合并小问题的解,从而得到整个问题的解 二,分治递归表达式 分治算法一般都可以写出一个递归表达式:比如经典的归并排序的递归表达式:T(N)=2T(N/2)+O(N) T(N)代表整个原问题,采用了分治解决方案后,它可以表示成: ①分解成了两个规模只有原来一半(N/2)的子问题:T(N/2) ②当解决完这两个子问题T(N/2)之后,再合并这两个子问题需要的代价是 O(N) 递

改进的冒泡排序算法二

/** * Project Name:Algorithm * File Name:BubbleSortImprove2.java * Package Name: * Date:2017年9月14日上午11:30:48 * Copyright (c) 2017, [email protected] All Rights Reserved. * */ /** * ClassName:BubbleSortImprove2 * Function: 改进的冒泡排序算法, 测试数据集:6 3 5 7 0 4

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

转载请注明出处,谢谢! 冒泡排序算法思想: 自下而上(或上而下)扫描记录序列,相邻的两条记录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

AACOS:基于编译器和操作系统内核的算法设计与实现

AACOS:基于编译器和操作系统内核的算法设计与实现 [计算机科学技术] 谢晓啸 湖北省沙市中学 [关键词]: 编译原理,操作系统内核实现,算法与数据结构,算法优化 0.索引 1.引论 1.1研究内容 1.2研究目的 1.3研究提要 正文 2.1研究方法 2.2编译器部分 2.2.1从计算器程序中得到的编译器制作启示 2.2.2在编译器中其它具体代码的实现 2.2.3编译器中栈的高级应用 2.2.3编译器中树的高级应用 2.2.4编译器与有限状态机 2.3操作系统内核部分 2.3.1操作系统与底

“谁是大V”算法设计 (Map-Reduce TopN)

作业设计与资料 链接: http://pan.baidu.com/s/1o6MJTyi 密码: 628d 一.     作业要求   根据关注列表relsample.json文件,设计MapReduce算法得到被关注次数最多的前十人,即寻找谁是大V. 二.     算法设计   第一个Mapper用于解析json文件: 从relsample.json文件中解析出ids列表的内容,即每个人所关注的人的列表.输出的value为列表中的每一项,k为one. 对应的文件为\src\myMapper\re

【字符串处理算法】将输入字符串中的各个单词反序的算法设计及C代码实现

一.需求描述 输入一个字符串,编写程序将该字符串中的各个单词反序拼装并输出.例如,如果输入的字符串是"Hello, how do you do",那么输出的字符串为"do you do how Hello,".注意保留各个单词之间的空格及相应的标点符号. 二.算法设计 通过观察示例字符串(即"Hello, how do you do"),我们可以看到该字符串中各个单词与空格之间的关系为:单词总数=空格总数+1.也就是说,示例字符串中的空格总数为4

《算法之道》精华 算法设计部分

<算法之道>精华 算法设计部分 本书作者邹恒明,作者另有一本书<数据结构之弦>,以及<操作系统之哲学原理>都是非常好的书 这本书能够算得上是深入浅出.文笔非常好,作者加入了非常多自己的思考 本文仅包含算法设计部分,算法分析略去,并没有严格依照章节顺序来记录 附录 算法随想 有人喜欢遍历,希望踏遍千山万水,人生丰富多彩:有人一生贪婪,眼界不宽,及时行乐:有人注定穷搜,辛辛苦苦,收获有限:有人善用时空均衡,用最少的时间办最多的事情.十分精明:有人会分治,再难的问题也能解决.

若干排序算法简单汇总(二)

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/36706131 作者:小马 一希尔排序 上一篇讲到的直接插入排序,时间复杂度O(n^2). 请在脑海里想一下它的过程.如果一个序列本来就是有序的,对它排序的时间复杂度是O(n).所以当序列基本有序时,插入排序排序的效率大大提高,因为减少了移动的动作. 另外,直接插入排序还有一个特点,当n比较小时,它的效率比较高. 希尔排序正是基于上面两个思想做的一种改进算法.它先将整个序列分成若干

【字符串处理算法】回文判断的算法设计及C代码实现

一.需求描述 输入一个字符串,编写程序判断这个字符串是否是回文串. 为了便于说明,设定输入的字符串分为中文字符串和非中文字符串两种.其中,中文字符串中仅包含中文字符,非中文字符串中不包含中文字符. 所谓回文串,是指正读和反读都一样的字符串.下面举几个例子予以说明: 1."level"是一个非中文字符的回文串,因为正读和反读都是"level". 2."Good"不是一个非中文字符的回文串. 3."我爱我"是一个中文字符的回文串,