描述
简单来讲,Shaker排序就是一个两个方向的冒泡排序,也称为鸡尾酒排序,双向冒泡排序。
示例:
6 5 4 3 2 1
第一轮右交换:5 4 3 2 1 6
shift = 4;
right = 4;
第一轮左交换:1 5 4 3 2 6
shift = 1;
left = 1;
第二轮右交换:1 4 3 2 5 6
shift = 3;
right = 3;
第二轮左交换:1 2 4 3 5 6
shift = 3;
left = 3;
第二轮右交换:1 2 3 4 5 6
shift = 3;
left =3;
此时left = right,即排序完成
代码实现
java实现
package com.immunize.Arithmetic;
/**
* 气泡排序或冒泡排序 改进版
*
* Shaker排序法,双向冒泡排序,鸡尾酒排序
*
* @author Mr IMMUNIZE
*
*/
public class ShakerSort {
public static void main(String[] args) {
int[] number = { 11, 2, 3, 4, 54, 622, 7, 81, 92, 10 };
// BubbleSort1(number);
BubbleSort2(number);
for (int i = 0; i < number.length; i++) {
System.out.print(number[i] + " ");
}
}
// 普通冒泡排序
public static int[] BubbleSort1(int[] number) {
int i, j, tmp;
int flag = 1;
int length = number.length;
for (i = 0; i < length - 1; i++) {
for (j = 0; j < length - i - 1; j++) {
if (number[j] > number[j + 1]) {
swap(number, j, j + 1);
flag = 0;
}
}
}
return number;
}
/*
6 5 4 3 2 1
第一轮右交换:5 4 3 2 1 6
shift = 4;
right = 4;
第一轮左交换:1 5 4 3 2 6
shift = 1;
left = 1;
第二轮右交换:1 4 3 2 5 6
shift = 3;
right = 3;
第二轮左交换:1 2 4 3 5 6
shift = 3;
left = 3;
第二轮右交换:1 2 3 4 5 6
shift = 3;
left =3;
此时left = right,即排序完成
*/
// Shaker排序(鸡尾酒排序,双向冒泡排序)
public static int[] BubbleSort2(int[] number) {
int i;
int left = 0;
int right = number.length - 1;
int shift = 0;
while (left < right) {
// 向右进行气泡排序
for (i = left; i < right; i++) {
if (number[i] > number[i + 1]) {
swap(number, i, i + 1);
shift = i;
}
}
// 向左进行气泡排序
right = shift;
for (i = right; i > left; i--) {
if (number[i] < number[i - 1]) {
swap(number, i, i - 1);
shift = i;
}
}
left = shift;
}
return number;
}
// Swap方法
private static void swap(int[] number, int i, int j) {
int tmp;
tmp = number[i];
number[i] = number[j];
number[j] = tmp;
}
}
C++实现
// Shaker.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#define MAX 10
#define swap(x,y) {int tmp;tmp =x;x =y;y = tmp;}
void ShakerSort(int number[]);
void BubbleSort(int number[]);
void Print(int number[]);
int main()
{
int number[] = {12,23,43,4,65,68,7,448,9,1};
ShakerSort(number);
//BubbleSort(number);
Print(number);
return 0;
}
//普通冒泡排序
void BubbleSort(int number[]){
int i,j;
int flag = 1;
for(i = 0;i<MAX;i++){
for(j = 0;j<MAX-1-i;j++){
if(number[j] > number[j+1]){
swap(number[j],number[j+1]);
flag = 0;
}
}
}
}
//Shaker排序
/*
6 5 4 3 2 1
第一轮右交换:5 4 3 2 1 6
shift = 4;
right = 4;
第一轮左交换:1 5 4 3 2 6
shift = 1;
left = 1;
第二轮右交换:1 4 3 2 5 6
shift = 3;
right = 3;
第二轮左交换:1 2 4 3 5 6
shift = 3;
left = 3;
第二轮右交换:1 2 3 4 5 6
shift = 3;
left =3;
此时left = right,即排序完成
*/
void ShakerSort(int number[]){
int i, j,shift ;
int left = 0;
int right = MAX-1;
while(left < right){
for(i = left;i<right;i++){
if(number[i] > number[i+1]){
swap(number[i],number[i+1]);
shift = i;
}
}
right = shift;
for(j = right;j>left;j--){
if(number[j-1]>number[j]){
swap(number[j-1],number[j]);
shift = j;
}
}
left = shift;
}
}
void Print(int number[]){
for(int i = 0;i<MAX;i++){
printf("%d ",number[i]);
}
}