Java學習第14天—陣列高階應用—比較排序及其優化
阿新 • • 發佈:2018-12-10
比較排序
比較排序:compare(選擇排序:select)
原理:依次拿某個位置上的元素和其後的所有元素比較,大的放後邊,每次確定的就是此位置上的元素.比較的趟數是元素個數減1
package com.nim.sort; /* * 比較排序及其優化 */ public class SelectSortDemo { public static void main(String[] args) { int[] arr = getArray(); System.out.println("排序前"); print(arr); int[] arr2 = copyArray(arr); System.out.println("排序前"); print(arr2); System.out.println("----------------"); selectSort(arr); System.out.println("排序後"); print(arr); selectSort2(arr2); System.out.println("排序後"); print(arr2); } // 複製一個數組 public static int[] copyArray(int[] arr) { int[] arr2 = new int[arr.length]; for (int i = 0; i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } // 生成一個元素個數為1000的隨機陣列 public static int[] getArray() { int[] arr = new int[1000]; for (int i = 0; i < arr.length; i++) { arr[i] = (int) (Math.random() * 1000 + 1); } return arr; } // 列印方法 public static void print(int[] arr) { for (int i = 0; i < arr.length; i++) { if (i != 0 && i % 100 == 0) { System.out.println(); } System.out.print(arr[i] + " "); } System.out.println(); } // 比較排序(選擇排序) public static void selectSort(int[] arr) { // 外層迴圈控制比較的輪數,固定值元素個數-1 int count = 0; for (int i = 0; i < arr.length - 1; i++) { // 內層迴圈控制的是兩兩比較的次數 for (int j = i + 1; j < arr.length; j++) { if (arr[i] > arr[j]) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; count++; } } } System.out.println("優化前的比較排序交換的次數是:" + count); } // 優化比較排序 public static void selectSort2(int[] arr) { // 外層迴圈控制比較的輪數,固定元素個數-1 int count = 0; for (int i = 0; i < arr.length - 1; i++) { // 先記錄確定位置上的索引和值 int index = i; int value = arr[i]; // 找到除了確定索引位置之外的元素最小值 for (int j = i + 1; j < arr.length; j++) { if (arr[j] < value) { index = j; value = arr[j]; } } // 確定是否有必要交換兩個位置的值 if (index != i) { int temp = arr[i]; arr[i] = arr[index]; arr[index] = temp; count++; } } System.out.println("優化後的比較排序交換的次數是:" + count); } }
氣泡排序:
第一輪排序:確定陣列最後位置上的元素。兩兩比較大的往後移;第二輪排序:確定陣列倒數第二位置上的元素。兩兩比較,大的往後移。其他位置上的元素以此類推排序
比較的輪數為元素個數減1,(剩最後一個位置,只有一個元素,不需要比較了)每輪中兩兩比較的次數逐漸遞減
使用迴圈的巢狀
外層迴圈控制比較的輪數 次數固定 元素個數減1
內層迴圈控制每輪比較中兩兩交換的次數
比較排序(選擇排序)
第一輪排序:確定陣列第一個位置上的元素,用第一個和後面的比,誰小誰放在第一個位置,再用第一個位置的數和後後面的比,再把小的放在第一個.......
第二輪排序:確定陣列第二個位置上的元素,和第一輪一樣的比較方法。。。。。。
比較輪數 :元素個數減1
使用迴圈巢狀 外層迴圈控制比較的輪數,次數固定元素個數減1
內層迴圈控制的是當前位置和其後所有元素進行比較的次數,開始值隨著輪數增加,結束值始終是最後一個元素。
比較排序的優化 確定某個元素時,有可能交換多次
優化 先把要確定的某個位置的索引和值記錄下來
然後確定剩下元素的最小值,再和記錄的值比較看是否需要交換,如果比確定的值小,就交換。