1. 程式人生 > >採用分而治之思想結合遞迴對陣列進行排序

採用分而治之思想結合遞迴對陣列進行排序

最近在學動態規劃中, 不斷地提到分而治之思想和遞迴!

 就想到能不能採用分而治之思想結合遞迴對陣列進行排序,  

代替以前的氣泡排序選擇排序呢?然後自己想著想著, 還真實現了!

程式碼如下:

/**
 * 從小到大進行排序      指導思想: 分而治之+遞迴
 */
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;
	}
	
}

程式測試結果如下: