传统冒泡排序。
import java.util.Arrays;
/**
* @author 新新
* @ClassName: BubbleSort
* @Description: 冒泡排序
* @date 2022年03月17日
*/
public class BubbleSort1 {
public static void sort(int array[]) {
for (int i = 0; i < array.length - 1; i++) {
for (int j = 0; j < array.length - i - 1; j++) {
int tmp = 0;
if (array[j] > array[j + 1]) {
tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
}
}
}
}
public static void main(String[] args) {
//int[] array = new int[]{2, 3, 4, 5, 9, 6, 7, 8, 1};
//int[] array = new int[]{3, 4, 9, 2, 1, 5, 6, 7, 8};
int[] array = new int[]{7, 2, 9, 1, 3, 8, 4, 5, 6};
sort(array);
System.out.println(Arrays.toString(array));
}
}
冒泡排序(有序区优化)。
用变量记录最后一次交换的位置。
用标识符标识出无序区与有序区界限位置,有序区内的元素不再参与比较。
import java.util.Arrays;
/**
* @author 新新
* @ClassName: BubbleSort
* @Description: 冒泡排序(有序区优化)。
* @date 2022年03月17日
*/
public class BubbleSort2 {
/**
* 有序区优化。
* 用变量记录最后一次交换的位置。
* 用标识符标识出无序区与有序区界限位置,有序区内的元素不再参与比较。
*
* @param array
*/
public static void sort(int array[]) {
//记录最后一次交换的位置。
int lastExchangeIndex = 0;
//无序数列的边界,每次比较只需要比到这里为止。
int sortBorder = array.length - 1;
for (int i = 0; i < array.length - 1; i++) {
//有序标记,每一轮的初始值都是true。
boolean isSorted = true;
for (int j = 0; j < sortBorder; j++) {
int tmp = 0;
if (array[j] > array[j + 1]) {
tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
//因为有元素进行交换,所以不是有序的,标记为false。
isSorted = false;
//更新为最后一次交换元素的位置。
lastExchangeIndex = j;
}
}
sortBorder = lastExchangeIndex;
if (isSorted) {
break;
}
}
}
public static void main(String[] args) {
//int[] array = new int[]{2, 3, 4, 5, 9, 6, 7, 8, 1};
//int[] array = new int[]{3, 4, 9, 2, 1, 5, 6, 7, 8};
int[] array = new int[]{7, 2, 9, 1, 3, 8, 4, 5, 6};
sort(array);
System.out.println(Arrays.toString(array));
}
}
鸡尾酒排序。
第一次从左侧循环到右侧,然后再从右侧循环到左侧,这是一个大循环。
然后再从左侧循环到右侧,从右侧循环到左侧。
适用于大部分元素已经有序的情况。
import java.util.Arrays;
/**
* @author 新新
* @ClassName: BubbleSort
* @Description: 鸡尾酒排序
* @date 2022年03月17日
*/
public class CocktailSort1 {
/**
* 鸡尾酒排序。
* 第一次从左侧循环到右侧,然后再从右侧循环到左侧,这是一个大循环。
* 然后再从左侧循环到右侧,从右侧循环到左侧。
* 适用于大部分元素已经有序的情况。
* @param array
*/
public static void sort(int array[]) {
int tmp = 0;
for (int i = 0; i < array.length / 2; i++) {
//有序标记,每一轮的初始值都是true。
boolean isSorted = true;
//奇数轮,从左向右比较和交换。
for (int j = i; j < array.length - i - 1; j++) {
if (array[j] > array[j + 1]) {
tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
//有元素交换,所以不是有序的,标记变为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]) {
tmp = array[j];
array[j] = array[j - 1];
array[j - 1] = tmp;
//因为有元素进行交换,所以不是有序的,标记变为false。
isSorted = false;
}
}
if (isSorted) {
//没有元素位置变化。
break;
}
}
}
public static void main(String[] args) {
//int[] array = new int[]{2, 3, 4, 5, 9, 6, 7, 8, 1};
//int[] array = new int[]{3, 4, 9, 2, 1, 5, 6, 7, 8};
int[] array = new int[]{7, 2, 9, 1, 3, 8, 4, 5, 6};
sort(array);
System.out.println(Arrays.toString(array));
}
}
鸡尾酒排序(有序区优化)。
第一次从左侧循环到右侧,然后再从右侧循环到左侧,这是一个大循环。
然后再从左侧循环到右侧,从右侧循环到左侧。
适用于大部分元素已经有序的情况。
有序区优化。
用变量记录最后一次交换的位置。
用标识符标识出无序区与有序区界限位置,有序区内的元素不再参与比较。
import java.util.Arrays;
/**
* @author 新新
* @ClassName: BubbleSort
* @Description: 鸡尾酒排序(有序区优化)。
* @date 2022年03月17日
*/
public class CocktailSort2 {
/**
* 鸡尾酒排序。
* 第一次从左侧循环到右侧,然后再从右侧循环到左侧,这是一个大循环。
* 然后再从左侧循环到右侧,从右侧循环到左侧。
* 适用于大部分元素已经有序的情况。
*
* 有序区优化。
* 用变量记录最后一次交换的位置。
* 用标识符标识出无序区与有序区界限位置,有序区内的元素不再参与比较。
*
* @param array
*/
public static void sort(int array[]) {
//记录从左到右的循环最后一次交换的位置。
int lastRightExchangeIndex = 0;
//记录从右到左的循环最后一次交换的位置。
int lastLeftExchangeIndex = 0;
//标识符,无序数列的边界,每次从左到右比较只需要比到这里为止。
int rightSortBorder = array.length - 1;
//标识符,无序数列的边界,每次从右到左比较只需要比到这里为止。
int leftSortBorder = 0;
int tmp = 0;
//控制所有排序回合。
for (int i = 0; i < array.length / 2; i++) {
//有序标记,每一轮的初始值都是true。
boolean isSorted = true;
//奇数轮,从左向右比较和交换元素。
for (int j = i; j < rightSortBorder; j++) {
if (array[j] > array[j + 1]) {
tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
//有元素交换,所以不是有序的,标记变为false。
isSorted = false;
//更新为最后一次交换元素的位置。
lastRightExchangeIndex = j;
}
}
rightSortBorder = lastRightExchangeIndex;
if (isSorted) {
//没有元素位置变化。
break;
}
//在偶数轮之前,将isSorted重新标记为true。
isSorted = true;
//偶数轮,从右向左比较和交换元素。
for (int j = array.length - i - 1; j > leftSortBorder; j--) {
if (array[j] < array[j - 1]) {
tmp = array[j];
array[j] = array[j - 1];
array[j - 1] = tmp;
//因为有元素进行交换,所以不是有序的,标记变为false。
isSorted = false;
//更新为最后一次交换元素的位置。
lastLeftExchangeIndex = j;
}
}
leftSortBorder = lastLeftExchangeIndex;
if (isSorted) {
//没有元素位置变化。
break;
}
}
}
public static void main(String[] args) {
//int[] array = new int[]{2, 3, 4, 5, 9, 6, 7, 8, 1};
//int[] array = new int[]{3, 4, 9, 2, 1, 5, 6, 7, 8};
int[] array = new int[]{7, 2, 9, 1, 3, 8, 4, 5, 6};
sort(array);
System.out.println(Arrays.toString(array));
}
}