不二如是 发表于 2016-12-5 11:23:47

0 1 0 7 - 小天才冒泡排序法 - 【深度扫盲】

本帖最后由 不二如是 于 2016-12-5 15:30 编辑



随机输入一串数字,然后基于冒泡排序,从大到小排列而成!

来,这里有小甲鱼老湿讲的一片冒泡排序!相当经典,传送门 -> ❂

好吧,我在用非常简单的语言解释下哈:

原理是:

临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换

这样一趟过去后,最大或最小的数字被交换到了最后一位

然后再从头开始进行两两比较交换,直到倒数第二位时结束

例子为从小到大排序,即最大的放最后!

假设,现在的数列是:

8,5,6,7,3,9

第一次,比较第一位。

8,5

8>5 , 故而交换


第一次循环 位置1 位置2 位置3 位置4 位置5 位置6
第一次 5 8 6 7 3 9
第二次 5 6 87 3 9
第三次 5 6 7 8 3 9
第四次 5 67 3 8 9
第五次 5 6 7 3 8 9


第二次循环,仍是从头开始。

因为5 < 6 ,所以不交换。

故而递增下一位判断。


第二次循环 位置1 位置2 位置3 位置4 位置5 位置6
第一次 5 6 7 38 9
第二次 5 6 7 3 8 9
第三次 5 6 3 7 8 9
第四次 5 6 3 7 8 9



第三次循环 位置1 位置2 位置3 位置4 位置5 位置6
第一次 5 6 3 7 8 9
第二次 5 3 6 7 8 9




第四次循环 位置1 位置2 位置3 位置4 位置5 位置6
第一次 3 5 6 78 9


最终得到从小到大排序:

3,5,6,7,8,9

有没有觉得很好玩~

脚本实现也是这样,每次按位比较,到倒数第二项就结束!

直到第一位,小于(大于)第二位,就按从小(大)到大(小)的数据排列。

在写脚本前,有些问题还需要深入思考下!

就是循环种类!

你发现没有其实在冒泡排序中存在两种排序方式。

第一种,小循环,按照位数两两比较

第二种,大循环,进行每轮之间的循环!

小循环,很好理解。

那么问题来了,大循环,如何判断是否要进行下一轮循环呢?

没错,就是设置一个判断变量,用来标志是否要进行下一轮。

靠!

你这说跟没说一样,好不好啦~

那怎样确定这个判断变量呢?

没错就是通过小循环,来定的!

如果小循环发生了调换,那么这个判断值默认为0,认为需要进行下一轮

如果小循环第一、二位,都没有发生调换,判断值为1,那就不需要进行下一轮啦!

来吧,看脚本实现:





buluan 发表于 2017-1-9 12:43:28

不二大大,新人报道,非常感谢您的分享,可惜不够分下载看看了!

不二如是 发表于 2017-1-9 12:59:07

buluan 发表于 2017-1-9 12:43
不二大大,新人报道,非常感谢您的分享,可惜不够分下载看看了!

欢迎~

{:10_336:}

buluan 发表于 2017-1-9 16:12:42

不二如是 发表于 2017-1-9 12:59
欢迎~

不过看图片自己照着弄成了,冒泡程序完成了,谢谢不二老师!

不二如是 发表于 2017-1-9 18:46:54

buluan 发表于 2017-1-9 16:12
不过看图片自己照着弄成了,冒泡程序完成了,谢谢不二老师!

{:10_303:}完成就好~

识海君 发表于 2017-1-10 19:13:13

温故而知新~感谢分享~顺便问一下:我们一般说的冒泡排序是指原始的冒泡排序还是改进后的冒泡排序呀,做了一道题,答案说冒泡排序的比较次数与初始序列有关。但是除非设置一个flag来判断是否已经有序,不然比较次数肯定是n(n-1)/2呀{:9_219:}

不二如是 发表于 2017-1-10 19:15:05

识海君 发表于 2017-1-10 19:13
温故而知新~感谢分享~顺便问一下:我们一般说的冒泡排序是指原始的冒泡排序还是改进后的冒泡排序呀,做了一 ...

是的,冒泡排序,只跟数组个数有关系

准确说,排序次数 <=n(n-1)/2

手动数一次就有感觉了

小杰ol 发表于 2017-1-12 23:37:48

m9(`)就是你!

不二如是 发表于 2017-1-13 07:01:19

小杰ol 发表于 2017-1-12 23:37
m9(`)就是你!

{:10_257:}m9金立手机吗
页: [1]
查看完整版本: 0 1 0 7 - 小天才冒泡排序法 - 【深度扫盲】