傳統冒泡排序。
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));}}
總結
以上是生活随笔為你收集整理的冒泡排序和鸡尾酒排序的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。