优化&算法-2
冒泡排序
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大
到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有
相邻元素需要交换,也就是说该元素已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序
排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
冒泡排序算法的原理如下:
1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2)对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后
的元素应该会是最大的数。
3)针对所有的元素重复以上的步骤,除了最后一个。
4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
列如:
数组元素> 5 1 7 2 6 4 3 16
1)由于第一个元素5比第二个元素大1,交换它们的位置。
1 5 7 2 6 4 3 16
2)对比每个相邻的元素,此时到第二个元素5与第三个元素7,不交换位置
1 5 7 2 6 4 3 16
3)对比每个相邻的元素,此时到第三个元素7与第四个元素2,交换位置
1 5 2 7 6 4 3 16
4)对比每个相邻的元素,此时到第四个元素7与第五个元素6,交换位置
1 5 2 6 7 4 3 16
5)对比每个相邻的元素,此时到第五个元素7与第六个元素4,交换位置
1 5 2 6 4 7 3 16
6)对比每个相邻的元素,此时到第六个元素7与第七个元素3,交换位置
1 5 2 6 4 3 7 16
6)对比每个相邻的元素,此时到第七个元素7与第八个元素16,不换位置
1 5 2 6 4 3 7 16
双冒泡排序
双向冒泡算法,极大的减少了循环排序的次数
1)传统冒泡气泡排序的双向进行,先让气泡排序由左向右进行,再来让气泡排序由右往
左进行,如此完成一次排序的动作
2)使用left与right两个旗标来记录左右两端已排序的元素位置。
3)当往左递进left >=往右递进的 right时,则排序完成。
例子如下所示:
排序前:45 19 77 81 13 28 18 19 77 11
往右排序:19 45 77 13 28 18 19 77 11 [81]
向左排序:[11] 19 45 77 13 28 18 19 77 [81]
往右排序:[11] 19 45 13 28 18 19 [77 77 81]
向左排序:[11 13] 19 45 18 28 19 [77 77 81]
往右排序:[11 13] 19 18 28 19 [45 77 77 81]
向左排序:[11 13 18] 19 19 28 [45 77 77 81]
往右排序:[11 13 18] 19 19 [28 45 77 77 81]
向左排序:[11 13 18 19 19] [28 45 77 77 81]
此时28>=19条件成立排序完成。
快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。
快速排序的基本思想:首先选取一个记录作为枢(shu)轴,不失一般性,可选第一个记
录,依它的关键字为基准重排其余记录,将所有关键字比它大的记录都安置在它之后,
而将所有关键字比它小的记录都安置在之前,由此完成一趟快速排序;之后,分别对由
一趟排序分割成的两个子序列进行快速排序。
在大数据情况下要使用快速排序。
列如:
数组元素> 5 1 7 2 6 4 3 16
思路:
取第一个数,把小于它的数往左移动,把大于它的数右移动
1)最左侧大于5的为7,最右侧小于5的为3,7与3对调
以5为枢轴> 5 1 3 2 6 4 7 16
2)全部对调完成,此时左侧小于5,右边大于5
5 1 3 2 | 6 4 7 16
3)5移动到分割位置
1 3 2 5 6 4 7 16
4)如果把数组元素分为三部分的话 左侧<中间<右侧
1 3 2 | 5 | 6 4 7 16
此时只需对两侧再重复以上操作就可以了
5)重复以上操作
1 3 2 > 1 2 3
此时左侧
6 4 7 16 > 4 6 7 16
简单来说:定义基数,比它小的往左排,比它大的往右排。
归并排序
归并排序(MERGESORT)是建立在归并操作上的一种有效的排序算法,该算法是采用
分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到
完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并
成一个有序表,称为二路归并。
归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。
如 设有数列1 8 2 9 3 5 6 4 10
1)第一次归并后:{1 8},{2 9},{ 3 5},{ 4 6},{10}此时两两元素排序完的归并
2)第二次归并后:{1 2 8 9},{ 3 4 5 6} ,{10}此时两两元素归并
1与2 寻找最小数 1
8与2 寻找最小数 2
8与9寻找最小数 8
{1 2 8 9}
3)第三次归并后:{1 2 3 4 5 6 8 9} , {10}此时两两元素归并
1与3寻找到最小数1 {1}
2与3寻找最小数2 {1 2}
8与3寻找最小数3 {1 2 3}
8与4寻找最小数4 {1 2 3 4}
8与5寻找最小数5 {1 2 3 4 5}
8与6寻找最小数6 {1 2 3 4 5 6}
8 9 落下{1 2 3 4 5 6 8 9}
4)第四次归并后:{1 2 3 4 5 6 8 9 10}
思路:循环找到最小值落下