博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bubble Sort冒泡排序
阅读量:4465 次
发布时间:2019-06-08

本文共 2743 字,大约阅读时间需要 9 分钟。

冒泡排序是一种简单的排序算法. 它每次重复的访问过要排序的数列, 一次比较两个元素, 如果他们的顺错误, 就把他们交换过来. 

下面这种图很清晰的解释了什么是冒泡算法.

 具体算法描述如下:

1. 比较相邻的元素. 如果第一个比第二个大, 就交换他们两个.

2. 对每一对相邻元素作同样的工作, 从开始第一队到结尾的最后一对, 这样在最后的元素应该会是最大的数.

3. 针对所有的元素重复以上的步骤, 除了最后一个.

4. 重复步骤1-3, 直到排序完成.

 

我们来实现以下bubble sort

// int[] intList = new int[] { 2, -2, 6, 4, 5, 3, 7, 8, 11, 14 };private void BubbleSort1(int[] intList)        {            var watch = new Stopwatch();            watch.Start();            var count = 0;            for (int i = 0; i < intList.Length; i++)            {                for (int j = 0; j < intList.Length - 1 - i; j++)                {                    if (intList[j] > intList[j + 1]) // 相邻元素两两对比                    {                        var temp = intList[j + 1]; // 元素交换                        intList[j + 1] = intList[j];                        intList[j] = temp;                    }                    count++; // 计算次数                }            }            watch.Stop();            var printOut = string.Empty;            foreach (var item in intList)            {                printOut += " " + item;            }            Console.WriteLine($"Result 1: {printOut}");            Console.WriteLine($"Count time: {count}");            Console.WriteLine($"Response time {watch.Elapsed.TotalMilliseconds.ToString()}ms");        }

 

以上是最简单的算法.

让我们对bubble sort做个改动已达成最优.

这里我们整理一下思路.

当数组有些数字已经排序好 (e.g. 4,5,6,7), 我们遍历比较一次就没有必要再去比较.

因此, 在排序过程中, 我们可能会重复的去多次比较已经排好的序列, 这样就造成了冗余, 当数据量大时, 会明显的耗时.

为解决这个问题, 我们在这里加一个lastIndex索引, 用于标记最后一次交换的位置.

 

rivate void BubbleSort2(int[] intList)        {            var watch = new Stopwatch();            watch.Start();            int i = intList.Length - 1;            int count = 0; // 计数            while (i > 1)            {                int lastChange = 1; // 记录最后一次交换位置                for (int j = 0; j < i; j++)                {                    // 前面比后面大,则进行交换                    if (intList[j] > intList[j + 1])                    {                        intList[j] = intList[j] + intList[j + 1];                        intList[j + 1] = intList[j] - intList[j + 1];                        intList[j] = intList[j] - intList[j + 1];                        lastChange = j; // 每交换一次更新一次                    }                    count++;                }                i = lastChange;            }            watch.Stop();            var printOut = string.Empty;            foreach (var item in intList)            {                printOut += " " + item;            }            Console.WriteLine($"Result 1: {printOut}");            Console.WriteLine($"Count time: {count}");            Console.WriteLine($"Response time {watch.Elapsed.TotalMilliseconds.ToString()}ms");        }

 

转载于:https://www.cnblogs.com/TheMiao/p/9970492.html

你可能感兴趣的文章
SQLite3源程序分析之查询处理及优化
查看>>
mysql主从配置 转自http://www.cnblogs.com/sustudy/p/4174189.html
查看>>
JavaScript 获得今天的日期 (yy-mm-dd)格式
查看>>
288. Unique Word Abbreviation
查看>>
57)PHP,自动加载类注意项
查看>>
Java StuNote2
查看>>
HDU 3622 Bomb Game (二分+2-SAT)
查看>>
[Android开发学习] day07 &amp; day08
查看>>
mysql中主表和从表的关系
查看>>
iOS 文件操作:沙盒(SandBox)、文件操作(FileManager)、程序包(NSBundle)
查看>>
2018-2019-2 网络对抗技术 20165236 Exp 8 Web基础
查看>>
【CF 585E】 E. Present for Vitalik the Philatelist
查看>>
关于boost里面的string
查看>>
平凡的一天——3.28
查看>>
【HDU】1199 Color the Ball
查看>>
字符流缓冲区BufferedReader之readLine方法的原理
查看>>
iOS开发中使用文字图标iconfont
查看>>
textarea 在浏览器中禁用拖动和固定大小
查看>>
SIM卡
查看>>
洛谷 P1855 【榨取kkksc03】题解
查看>>