排序算法之鸡尾酒排序

【排序算法之鸡尾酒排序】5.3 鸡尾酒排序(Cocktail sort)
既然介绍了冒泡排序。就不得不说一下冒泡排序最为重要的一个变种——鸡尾酒排序(也称为定向冒泡排序)。此算法与冒泡排序的不同之处在于鸡尾酒排序是双向进行的,而冒泡排序则是单向进行的。
关于两种排序的效率方面,鸡尾酒排序在某些情况下比冒泡排序略微好那么一点点。
只是,在大部分乱序的情况下,鸡尾酒排序与冒泡排序的效率都非常差劲。
以数组{2,8,7,1,3}为例。鸡尾酒排序过程如图5-3所看到的。
排序算法之鸡尾酒排序
文章图片


其排序过程,也可參照例如以下动态图。
排序算法之鸡尾酒排序
文章图片


该动态图的原始链接为:http://zh.wikipedia.org/wiki/File:Sorting_shaker_sort_anim.gif



C代码实现:

#include #include #include void exchange(int &a, int &b) { int temp = a; a = b; b = temp; } //鸡尾酒排序 void cocktail_sort(int a[], int length) { for(int i=0; i=0; j++) { index = length-j-2; if( a[index]>a[index+1] ) { exchange(a[index], a[index+1]); } } i++; //将较大的数换到数组末尾 for(int j=(i+1)/2; ja[index+1] ) { exchange(a[index], a[index+1]); } } i++; } }int main(int argc, char** argv) { const int length = 10; int a[length]; //告诉rand方法,以time为种子去生成随机数 srand( (unsigned)time(NULL) ); for(int i=0; i

C++代码实现为:
#include #include #include #include using namespace std; void exchange(int &a, int &b){ int temp = a; a = b; b = temp; } void cocktail_sort(vector &a) { vector::iterator itStart = a.begin(); vector::iterator itEnd = a.end(); for(size_t i=0; i::iterator jt=itEnd-2-i/2; jt>=i/2+itStart; jt-- ) { if( *(jt)>*(jt+1) ) { exchange(*(jt), *(jt+1)); } //防止操作到vector以外的空间 if( jt==itStart ){ break; } } i++; //将较大的数换到数组末尾 for(vector::iterator jt=(i+1)/2+itStart; jt*(jt+1) ) { exchange(*(jt), *(jt+1)); } //防止操作到vector以外的空间 if( jt==itEnd-2 ){ break; } } i++; } } void show(vector &a){ for(vector::iterator it=a.begin(); it(time(NULL)) ); for(int i=0; i aVec(a, a+length); show(aVec); cocktail_sort(aVec); show(aVec); return 0; }


    推荐阅读