鸡尾酒排序

package com.algorithm.code;

import java.util.Arrays;

/**
 * 鸡尾酒排序
 * @author lenovo
 *
 */
public class CocktailSort {
	
	public static void main(String[] args) {
		int[] array = new int[] {2,3,4,5,6,7,8,9,1};
		sort(array);
		System.out.println(Arrays.toString(array));
	}
	
	/**
	 *  鸡尾酒排序规则大致和冒泡排序一样
	 * 只是鸡尾酒的排序过程就像钟摆一样,是左右来回遍历的
	 * 例如:第一轮是从右到左,第二轮则是从左到右,
	 *             第三轮又是从右到左,第四轮则是从左到右
	 * 鸡尾酒排序的缺点是代码量大概是冒泡排序的两倍,
	 * 优点是在特定情况下,能减少排序的回合数
	 * 适合大部分元素已经有序的情况下排序          
	 * @param array
	 */
	public static void sort(int[] array) {
		int temp = 0;
		for(int i = 0; i < array.length/2; i++) {
			boolean 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
					isSorted = false;
				}
			}
			//当一次遍历完成时,如果未发生元素交换,
			//则数组已经是有序的了,直接退出外层循环
			if(isSorted) {
				break;
			}
			
			//在从右到左排序之前,重新将isSorted置为true
			isSorted = true;
			
			//从右到左开始遍历
			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
					isSorted = false;
				}
			}
			//当一次遍历完成时,如果未发生元素交换,
			//则数组已经是有序的了,直接退出外层循环
			if(isSorted) {
				break;
			}
		}
	}

}

 

你可能感兴趣的:(java,算法,排序)