採用分而治之思想結合遞迴對陣列進行排序
阿新 • • 發佈:2019-02-18
最近在學動態規劃中, 不斷地提到分而治之思想和遞迴!
就想到能不能採用分而治之思想結合遞迴對陣列進行排序,
代替以前的氣泡排序和選擇排序呢?然後自己想著想著, 還真實現了!
程式碼如下:
/** * 從小到大進行排序 指導思想: 分而治之+遞迴 */ package mi; import java.util.Scanner; public class SortBySmallToBig { private static int [] array; public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner = new Scanner(System.in); System.out.print("請輸入陣列的長度:"); int arrayLength = scanner.nextInt(); array = new int[arrayLength]; System.out.print("請依次為陣列賦值:"); for(int i = 0; i < array.length; i++){ array[i] = scanner.nextInt(); } //輸出未排好序的陣列 System.out.print("未排好序的陣列:"); for(int i = 0; i < array.length; i++){ System.out.print(array[i] + " "); } System.out.println(""); //排序 sort(array, array.length - 1); //輸出排好序的陣列 System.out.print("已經排好序的陣列:"); for(int i = 0; i < array.length; i++){ System.out.print(array[i] + " "); } scanner.close(); } /** * 本函式的作用是從小到大進行排序 指導思想: 分而治之+遞迴 * @param array 待排序的陣列 * @param lastIndex 最後一個元素 * @return 排序好的陣列 */ public static int [] sort(int [] array, int lastIndex){ //如果陣列元素只有一個, 直接返回 if(lastIndex == 0){ return array; } //如果陣列元素只有二個, 只需交換兩個數的位置 if(lastIndex == 1){ if(array[0] > array[1]){ int temp; temp = array[lastIndex-1]; array[lastIndex-1] = array[lastIndex]; array[lastIndex] = temp; return array; } } //其他情況: 陣列元素在3個以上, //先將陣列中的第一個元素至倒數第二個元素中間的元素(包含第一個元素和倒數第二個元素)進行排序(從小到大), //然後將最後一個未參與排序的元素(即最後一個元素)插入到此元素前面已經排好序的元素中, //使得陣列依然從小到大 sort(array, lastIndex-1); //找出第一個大於最後一個元素的元素, 並將其下標記錄下來 int flag = -1; for(int i = 0; i < lastIndex; i++){ if(array[i] > array[lastIndex]){ flag = i; //記錄下標 break; } } //如果存在大於最後一個元素的元素, 則將最後一個元素插入到已經排好序的元素中去, 使得陣列依然從小到大 if(flag >= 0){ int tempLast = array[lastIndex]; for(int i = lastIndex-1; i >= flag; i--){ array[i+1] = array[i]; } array[flag] = tempLast; } return array; } }
程式測試結果如下: