对数器
package com.bigbear; import java.util.Arrays; import java.util.Random; /** * 对数器 * */ public class DataChecker {
public static void main(String[] args) {
for (int i = 0; i < 50; i++) { check(); } } private static void check() {
int[] arr = generateRandomArray();
int[] arr2 = new int[arr.length];
System.arraycopy(arr, 0, arr2, 0, arr.length); //java类的排序 Arrays.sort(arr); //对arr2进行排序 //SelectionSort.sortByMinPosAndMaxPos(arr2); //BubbleSort.sort(arr2); //InsertionSort.sortWithoutSwap(arr2); MergeSort.sort(arr2, 0, arr2.length - 1); boolean same = true; for (int i = 0; i < arr.length; i++) { if (arr[i] != arr2[i]) { same = false; } } System.out.println(same ? "right" : "wrong"); } private static int[] generateRandomArray() { //数组是对象,是引用类型 int length = 20; int[] arr = new int[length]; for (int i = 0; i < arr.length; i++) { Random rd = new Random(); arr[i] = rd.nextInt(length); } return arr; } static void print(int[] arr) { System.out.println("print result:"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(""); } }
选择排序:
package com.bigbear; /** * 选择排序排序 * 重复(元素个数-1)次 * 把第一个没有排序过的元素设置为最小值 * 遍历每个没有排序过的元素 * 如果元素 < 现在的最小值 * 将此元素设置成为新的最小值 * 将最小值和第一个没有排序过的位置交换 * */ public class SelectionSort { public static void main(String[] args) { int[] arr = {6, 5, 2, 4, 6, 3, 1, 9, 7}; //int[] arr = {4, 1, 13, 18, 5, 19, 18, 6, 13, 0, 7, 12, 10, 3, 10, 1, 13, 3, 8, 4}; System.out.println("初始数组:"); print(arr); sortByMinPos(arr); } public static void sortByMinPos(int[] arr) { for (int beginpos = 0; beginpos < arr.length - 1; beginpos++) { int minpos = beginpos; for (int i = beginpos + 1; i < arr.length; i++) { if (arr[i] < arr[minpos]) { minpos = i; } } swap(arr, beginpos, minpos); System.out.println("第" + (beginpos + 1) + "次循环的结果如下,其中minpos:" + minpos); print(arr); } } public static void sortByMinPosAndMaxPos(int[] arr) { for (int beginpos = 0; beginpos < arr.length / 2; beginpos++) { int minpos = beginpos; int maxpos = arr.length - beginpos - 1; for (int i = beginpos + 1; i < arr.length; i++) { if (arr[i] < arr[minpos]) { minpos = i; } if (arr[arr.length - i - 1] > arr[maxpos]) { maxpos = arr.length - i - 1; } } swap(arr, beginpos, minpos); //当最大值等于最小值循环开始的位置,上一步的交换使开始位置的值被交换了,所以最大值的位置要跟随变动 if (maxpos == beginpos) { //System.out.println("maxpos:" + maxpos + "变更为:" + minpos); maxpos = minpos; } //边界处理:当最大值的位置等于最大值循环交换的位置,则不用进行交换 if (maxpos != (arr.length - beginpos - 1)) { swap(arr, arr.length - beginpos - 1, maxpos); } // System.out.println("第" + (beginpos + 1) + "次循环的结果如下,其中minpos:" + minpos + ",maxpos:" + maxpos); // print(arr); } } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } private static void print(int[] arr) { for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(""); } }
冒泡排序:
package com.bigbear; /** * 冒泡排序 * */ public class BubbleSort { public static void main(String[] args) { int[] arr = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 1}; System.out.println("初始数组:"); print(arr); sort(arr); } public static void sort(int[] arr) { for (int loop = 0; loop < arr.length - 1; loop++) { for (int i = 0; i < arr.length - loop - 1; i++) { if (arr[i] > arr[i + 1]) { swap(arr, i, i + 1); } } //System.out.println("第" + (loop + 1) + "次循环的结果如下"); // print(arr); } } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } private static void print(int[] arr) { for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(""); } }
插入排序:
package com.bigbear; /** * 插入排序 * */ public class InsertionSort { public static void main(String[] args) { int[] arr = {39,44,38,5,47,15,36,26,27,2,46,4,19,50,48}; System.out.println("初始数组:"); print(arr); sortWithoutSwap(arr); //sortWithSwap(arr); } /** * 插入排序,采用临时变量标记插入位置,不交换 * * @param arr */ public static void sortWithoutSwap(int[] arr) { for (int i = 1; i < arr.length; i++) { int insertPos = i; //findInsertPos while (insertPos > 0 && arr[i] < arr[insertPos - 1]) { insertPos = insertPos - 1; } insert(arr, i, insertPos); //print(arr); } } /** * 将移动的元素插入到最小值的位置,并移动相邻的后续元素 * * @param arr * @param movePos * @param insertPos */ private static void insert(int[] arr, int movePos, int insertPos) { if (movePos == insertPos) { return; } int temp = arr[movePos]; for (int i = movePos; i > insertPos; i--) { arr[i] = arr[i - 1]; } arr[insertPos] = temp; } /** * 插入排序,相邻的两个数比较,符合条件交换 * * @param arr */ public static void sortWithSwap(int[] arr) { for (int begin = 1; begin < arr.length; begin++) { for (int i = begin; i > 0; i--) { if (arr[i] < arr[i - 1]) { swap(arr, i, i - 1); } } //print(arr); } } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } private static void print(int[] arr) { for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(""); } }
归并排序:
package com.bigbear; /** * 归并排序 * */ public class MergeSort { public static void main(String[] args) { int[] arr = {1, 4, 7, 8, 3, 6, 9}; sort(arr, 0, arr.length - 1); print(arr); } /** * @param arr 数组 * @param left 左边界 * @param right 右边界 */ public static void sort(int[] arr, int left, int right) { if (left == right) { return; } //分成两半 int mid = (left + right) / 2; //左边排序 sort(arr, left, mid); //右边排序 sort(arr, mid + 1, right); //左右合并 merge(arr, left, mid + 1, right); } private static void merge(int[] arr, int leftPoint, int rightPoint, int rightBound) { int middle = rightPoint - 1; int[] tempArr = new int[rightBound - leftPoint + 1]; int i = leftPoint; int j = rightPoint; int k = 0; while (i <= middle && j <= rightBound) { if (arr[i] <= arr[j]) { tempArr[k] = arr[i]; i++; } else { tempArr[k] = arr[j]; j++; } k++; } while (i <= middle) { tempArr[k++] = arr[i++]; } while (j <= rightBound) { tempArr[k++] = arr[j++]; } for (int m = 0; m < tempArr.length; m++) { arr[leftPoint + m] = tempArr[m]; } } // private static void merge(int[] arr) { // int middle = arr.length / 2; // int[] tempArr = new int[arr.length]; // // int leftPoint = 0; // int rightPoint = middle + 1; // int index = 0; // // // while (leftPoint <= middle && rightPoint < arr.length) { // if (arr[leftPoint] <= arr[rightPoint]) { // tempArr[index] = arr[leftPoint]; // leftPoint++; // } else { // tempArr[index] = arr[rightPoint]; // rightPoint++; // } // // index++; // } // // while (leftPoint <= middle){ // tempArr[index++] = arr[leftPoint++]; // } // // while (rightPoint < arr.length){ // tempArr[index++] = arr[rightPoint++]; // } // // // print(tempArr); // } private static void print(int[] arr) { for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(""); } }
快速排序: