鸡尾酒排序
-
鸡尾酒排序是一种在冒泡排序的基础上进行改进的算法。
- 和冒泡排序的从数组的一端一个个排序到另一端的单方向的顺序不同,鸡尾酒排序的元素比较和交换的双向的。 双向是什么意思呢?
-
就是说,对于鸡尾酒排序,第一轮
从左到右进行排序,这里和冒泡排序一模一样,但是第二轮就不一样了,此时需要的是
从右到左,换个方向进行排序,第三轮又变成从
左到右进行排序…
通俗点来说就是:鸡尾酒排序的过程就像是游乐场里面的海盗船,先从左到右,然后从右到左。
其次有个点,就是这个实现的方式就会略显复杂,因为需要控制两个方向,但是对于效率来说有了一定的提高,而且鸡尾酒排序中也会引入标记,用于跳出外层循环。
代码的实现方式:public static void sort(int[] array){ //交换数据的时候,用到的中间变量,将其直接提取出来定义了 int temp = 0; //外层循环,这里只需要执行一半的次数了,因为每一轮都会有一个来回两次处理操作。 for (int i = 0; i < array.length / 2; i++) { //标记,每一轮的初始值都为true boolean flag = true; //奇数轮,从左向右比较和交换 for (int j = i; j <array.length - 1 - i ; j++) { if (array[j] > array[j+1]){ temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; //如果有元素进行交换,则数组当前还不是有序的 flag = false; } } //这里需要注意,在开始之前必须把标记置为true之后才开始,也是一种初始化操作 flag = true; //偶数轮,从右向左比较和交换 for (int j = array.length - 1 - i; j > i ; j--) { if (array[j] < array[j-1]){ temp = array[j]; array[j] = array[j-1]; array[j-1] = temp; //如果有元素进行交换,则数组当前还不是有序的 flag = false; } } //如果经过了一个来回还是true,证明从左到右和从右到左都没有数据进行移动了,数组也是有序的了 if (flag){ break; } } }