1. 程式人生 > 實用技巧 >LeetCode 4. 尋找兩個正序陣列的中位數

LeetCode 4. 尋找兩個正序陣列的中位數

需求:
排序前:{4,6,8,7,9,2,10,1}
排序後:{1,2,4,5,7,8,9,10}
排序原理:

  1. 每一次遍歷的過程中,都假定第一個索引處的元素是最小值,和其他索引處的值依次進行比較,如果當前索引處的值大於其他某個索引處的值,則假定其他某個索引出的值為最小值,最後可以找到最小值所在的索引;
  2. 交換第一個索引處和最小值所在的索引處的值.

API設計

程式碼實現

package sort;
//選擇排序
public class Selection {
    public static void sort(Comparable[]a){
        for(int i=0;i<a.length-1;i++){
            int minIndex=i;
            for(int j=i+1;j<a.length;j++){
                if(greater(a[minIndex],a[j])) {
                    minIndex=j;
                }
            }
            exch(a,i,minIndex);
        }
    }
    /*
比較v元素是否大於w元素
*/
    private static boolean greater(Comparable v,Comparable w){
        return v.compareTo(w)>0;
    }
    /*
    陣列元素i和j交換位置
    */
    private static void exch(Comparable[] a,int i,int j){
        Comparable t = a[i];
        a[i]=a[j];
        a[j]=t;
    }
}
package test;

import sort.Selection;

import java.util.Arrays;
//測試類
public class TestSelection {
    public static void main(String[] args) {
        Integer[] a = {4,6,8,7,9,2,10,1};
        Selection.sort(a);
        System.out.println(Arrays.toString(a));
    }
}

複雜度分析
資料比較次數:
(N-1)+(N-2)+(N-3)+...+2+1=((N-1)+1)*(N-1)/2=(N^2-N)/2;
資料交換次數:
N-1
時間複雜度:N2/2-N/2+(N-1)=(N

2+N)/2-1;
根據大O推導法則,保留最高階項,去除常數因子,時間複雜度為O(N^2).