鸡尾酒算法实现冒泡排序的优化
上一篇介绍了冒泡算法及其优化方案,但其优化是从每轮的比较次数上优化,而“鸡尾酒算法”可以从轮次上优化。
一、什么时鸡尾酒排序?
鸡尾酒排序又称为快乐小时排序,它基于冒泡排序进行的优化方案。
二、鸡尾酒算法思想
冒泡排序是元素单向比较,而鸡尾酒排序却是双向。
列举一个最简单的栗子array[2, 3, 4, 5, 6, 7, 8, 9, 1],
如果按照传统的冒泡排序进行操作,
第一轮结果:[2, 3, 4, 5, 6, 7, 8, 1, 9],只有9和1交换;
第二轮结果:[2, 3, 4, 5, 6, 7, 1, 8, 9],只有8和1交换;
第三轮结果:[2, 3, 4, 5, 6, 1, 7, 8, 9],只有7和1交换;
。。。
第八轮结果:[1, 2, 3, 4, 5, 6, 7, 8, 9],只有2和1交换;
每一轮执行过程中,前面元素的比较,很明显做了无用功,对于本次栗子中的数组,如果元素比较的顺序是从右边开始,那就省了很多功夫,加入鸡尾酒算法,可以实现这个操作。
鸡尾酒算法实现冒泡排序的优化第一版:
[code]public void sortArray(int[] array){ int temp=0; boolean isSorted = true; for(int i=0; i<array.length/2-1; i++){ isSorted = true; //奇数轮比较 for(int j=i; j<array.length-i-1; j++){ if(array[j]>array[j+1]){ temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; isSorted = false; } } if(isSorted){ break; } //偶数轮比较 for(int j=array.length-i-1; j>i; j--){ if(array[j]<array[j-1]){ temp = array[j]; array[j] = array[j-1]; array[j-1] = temp; isSorted = false; } } if(isSorted){ break; } } }
大循环中我们将循环轮次优化为array.length/2次,奇数轮比较顺序从左到右,每一轮 j 的开始项也从冒泡算法的0变成了 i ,因为下面还有偶数轮比较排序,偶数轮排序会将最左边的元素变成有序区。
但是上一篇说到两种优化方案,这里也有基于鸡尾酒算法的两种优化方案。
鸡尾酒算法实现冒泡排序的优化第二版:
[code]public void sortArray(int[] array){ int temp=0; boolean isSorted = true; int lastRightIndex = 0; int lastLeftIndex = 0; //右边界 int rightBorder = array.length-1; //左边界 int leftBorder = 0; for(int i=0; i<array.length/2-1; i++){ isSorted = true; //奇数轮比较 for(int j=leftBorder; j<rightBorder; j++){ if(array[j]>array[j+1]){ temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; lastRightIndex = j; isSorted = false; } } rightBorder = lastRightIndex; if(isSorted){ break; } //偶数轮比较 for(int j=rightBorder; j>leftBorder; j--){ if(array[j]<array[j-1]){ temp = array[j]; array[j] = array[j-1]; array[j-1] = temp; lastLeftIndex = j; isSorted = false; } } leftBorder = lastLeftIndex; if(isSorted){ break; } } }
与传统冒泡法的第二版优化一样,设置了每一轮的循环边界,由于鸡尾酒算法是双向排序的,所以这里的边界也分别定义了左、右边界 leftBorder 和 rightBorder ,即每一轮循环都是以这两个边界为循环次数计算,相对于鸡尾酒第一版,第二版比较容易理解。
鸡尾酒算法实现冒泡排序的优化确实可以很大程度上减少了比较的无用功,同时也要注意它的代码量也是之前的两倍。
鸡尾酒算法排序介绍至此。
阅读更多- 冒泡排序实现及算法优化(java)
- java版排序算法简介及冒泡排序以及优化,选择排序,直接插入排序,希尔排序,堆排序,快速排序及其优化前言 2 分类 2 稳定性 3 时间复杂度 4 Java实现版本 5 1、冒泡排序 6 2、选择排序
- 算法代码实现之Union-Find,C++实现,quick-find、quick-union、加权quick-union(附带路径压缩优化)
- 排序算法-对冒泡排序的优化改进算法
- 看数据结构写代码(2) 选择排序 和 冒泡排序 算法优化
- 数据仓库-matlab智能优化算法实现
- 数据结构与算法——三种基础排序算法C#实现(冒泡排序、选择排序、插入排序)
- 白话经典算法系列之一 冒泡排序的三种实现 .
- 针对新闻标签提取的tf-idf优化算法1.0版本——基于jieba分词实现
- 冒泡排序及其改进算法C语言实现
- KMP算法代码实现和优化(不太能理解具体的过程和该算法思想)
- SSE图像算法优化系列十六:经典USM锐化中的分支判断语句SSE实现的几种方法尝试。
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- python实现基础排序算法之(冒泡排序)
- [置顶] 【scala 数据结构和算法】Scala实现:冒泡排序
- SSE图像算法优化系列三:超高速导向滤波实现过程纪要(欢迎挑战)
- 算法代码实现之冒泡排序,C/C++ 实现
- 白话经典算法系列之一 冒泡排序的三种实现
- 【Java】Java的AES的算法实现(增加解密算法,优化域算法)
- 快速排序,冒泡排序,直接选择排序的算法实现