20191011:冒泡排序的改良版--Shaker排序

Shaker排序法

描述

简单来讲,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]);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IMMUNIZE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值