冒泡排序,单次排序,从小到大或从大到小,一遍过,代码简洁,但并不效率
鸡尾酒排序是冒泡排序的一种,又称为来回排序。它比冒泡排序要高级点,为何这么说呢
冒泡排序是先找最大,然后找第二大,然后一直找完
鸡尾酒排序是这样的,先找最大,再找最小,然后找第二大,再找第二小,依次类推,直至找不到了为止
举例,有数组[6, 4, 5, 1, 8, 7, 2, 3]
先从左到右两两比较并排序,直到8排到最右边
[4, 6, 5, 1, 8, 7, 2, 3]
[4, 5, 6, 1, 8, 7, 2, 3]
[4, 5, 1, 6, 8, 7, 2, 3]
[4, 5, 1, 6, 8, 7, 2, 3]
[4, 5, 1, 6, 7, 8, 2, 3]
[4, 5, 1, 6, 7, 2, 8, 3]
[4, 5, 1, 6, 7, 2, 3, 8]
然后再从右到左两两比较并排序,直到1排到最左边
[4, 5, 1, 6, 7, 2, 3, 8]
[4, 5, 1, 6, 7, 2, 3, 8]
[4, 5, 1, 6, 2, 7, 3, 8]
[4, 5, 1, 2, 6, 7, 3, 8]
[4, 5, 1, 2, 6, 7, 3, 8]
[4, 1, 5, 2, 6, 7, 3, 8]
[1, 4, 5, 2, 6, 7, 3, 8]
然后把7排到倒数第二
[1, 4, 5, 2, 6, 7, 3, 8]
[1, 4, 5, 2, 6, 7, 3, 8]
[1, 4, 2, 5, 6, 7, 3, 8]
[1, 4, 2, 5, 6, 7, 3, 8]
[1, 4, 2, 5, 6, 7, 3, 8]
[1, 4, 2, 5, 6, 3, 7, 8]
然后把二排到正数第二
[1, 4, 2, 5, 6, 3, 7, 8]
[1, 4, 2, 5, 6, 3, 7, 8]
[1, 4, 2, 5, 6, 3, 7, 8]
[1, 4, 2, 5, 3, 6, 7, 8]
[1, 4, 2, 3, 5, 6, 7, 8]
[1, 4, 2, 3, 5, 6, 7, 8]
[1, 2, 4, 3, 5, 6, 7, 8]
………………
依次类推,得到[1, 2, 3, 4, 5, 6, 7, 8]
有人会问什么时候结束,我们可以设置一个变量,如果有排序变化时,变量值改变,如果没有则不变,如果排序结束之后还没变,则表示排序已经是ok的了
下面,看一幅图:
这就是鸡尾酒排序的运作方式。
#include
#include
using namespace std;
const int maxn=10;
int n,s[maxn];
void Cocktailsort()
{
int left=0;
int right=n-1;
while(lefts[i+1]){
swap(s[i],s[i+1]);
}
}
right--;
//后半轮,将最小元素放到前面
for(int i=right;i>left;i--){
if(s[i]
其算法复杂度接近O(n),效率非常高了
(以上c代码,java代码实在难以理解)