算法題練習系列之(二十八): 插入與歸併

--------------------------------------------------------------------------------------------------------------------------------------------------------

時間限制:1秒  空間限制:32768K  代碼長度限制 100 KB

--------------------------------------------------------------------------------------------------------------------------------------------------------

題目描述

根據維基百科的定義:
插入排序是迭代算法,逐一獲得輸入數據,逐步產生有序的輸出序列。每步迭代中,算法從輸入序列中取出一元素,
將之插入有序序列中正確的位置。如此迭代直到全部元素有序。
歸併排序進行如下迭代操作:首先將原始序列看成N個只包含1個元素的有序子序列,然後每次迭代歸併兩個相鄰的
有序子序列,直到最後只剩下1個有序的序列。
現給定原始序列和由某排序算法產生的中間序列,請你判斷該算法究竟是哪種排序算法?
輸入描述:
輸入在第一行給出正整數N (<=100);隨後一行給出原始序列的N個整數;最後一行給出由某排序算法產生的
中間序列。這裏假設排序的目標序列是升序。數字間以空格分隔。
輸出描述:
首先在第1行中輸出“Insertion Sort”表示插入排序、或“Merge Sort”表示歸併排序;然後在第2行中輸出
用該排序算法再迭代一輪的結果序列。題目保證每組測試的結果是唯一的。數字間以空格分隔,且行末不得有
多餘空格。
輸入例子:
10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0
輸出例子:
Insertion Sort
1 2 3 5 7 8 9 4 6 0

-------------------------------------------------------------------------------------------------------------------------------------------------------

實現思路:

(1).先找出從哪個數字開始,該數字大於其右邊數字,記錄其索引位置;

(2).從該索引位置開始到最後,如果是插入排序,則數字順序完全一致,若不一致說明是歸併排序;

(3).判斷完是何種排序後,如果是插入排序,將索引位置的數字,移動到其合適位置;

(4).如果是歸併排序,將歸併的規模擴大2倍,繼續歸併一次;

(5).打印出處理後的數組即可。

--------------------------------------------------------------------------------------------------------------------------------------------------------


package com.biyao.algorithm.niuke.a1;

import java.util.Arrays;
import java.util.Scanner;
public class Main_a1_025 {
    
    public static void main(String[] args) {
    	
        Scanner scan = new Scanner(System.in);
        while(scan.hasNext()){
        	int n = scan.nextInt();
        	int [] num1 = new int[n];
        	int [] num2 = new int[n];
        	for (int i = 0; i < n; i++) {
        		num1[i] = scan.nextInt();
			}
        	for (int i = 0; i < n; i++) {
        		num2[i] = scan.nextInt();
        	}
        	String sortType = "Insertion Sort";
        	int index = 0;
        	for (int i = 0; i < n-1; i++) {
				if(num2[i] > num2[i+1]){
					index = i+1;
					break;
				}
			}
        	for (int i = index; i < n; i++) {
				if(num1[i] != num2[i]){
					sortType = "Merge Sort";
					break;
				}
			}
        	
        	if(sortType.equals("Insertion Sort")){
        		int num = num2[index];
        		int insertIndex = 0;
        		for (int i = 0; i < index; i++) {
					if(num2[i] > num){
						insertIndex = i;
						break;
					}
				}
        		for (int i = index; i > insertIndex; i--) {
					num2[i] = num2[i-1];
				}
        		num2[insertIndex] = num;
        	}else{
    			//如果是歸併排序 index的值表示這麼多的規模已經排序完,
    			//比如index==2 說明規模爲2的已經排序完 下一次排序規模爲4 
				index = 2*index;
				for(int i = 0;i<n;i+=index){
					int next = i+index>n?n:i+index;
					Arrays.sort(num2,i,next);
				}
        	}
        	
        	System.out.println(sortType);
        	for (int i = 0; i < n-1; i++) {
				System.out.print(num2[i] + " ");
			}
        	System.out.print(num2[n-1]);
        }
    }
    
}


發佈了66 篇原創文章 · 獲贊 8 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章