1. 程式人生 > >Coursera Algorithms week3 歸並排序 練習測驗1: Merging with smaller auxiliary array

Coursera Algorithms week3 歸並排序 練習測驗1: Merging with smaller auxiliary array

port 額外 ava i++ span compareto less 歸並 全部

題目原文:

Suppose that the subarray a[0] to a[n-1] is sorted and the subarray a[n] to a[2*n-1] is sorted. How can you merge the two subarrays so that a[0] to a[2*n-1] is sorted using an auxiliary array of length n (instead of 2n)

分析:

對兩個大小分別為n的有序子數組進行歸並,要求空間復雜度為n,正常情況下歸並排序在此處的空間復雜度為2n,但是由於兩個子數組分別是有序的,故用大小為n的額外子空間輔助歸並是個很合理的要求,實現如下:

 1 import java.util.Arrays;
 2 import edu.princeton.cs.algs4.StdRandom;
 3 
 4 public class MergeSortedSubArray {
 5     private static boolean less(Comparable v, Comparable w) {
 6         return v.compareTo(w) < 0;
 7     }
 8     public static void merge(Comparable[] array){
 9         int n = array.length/2;
10 Comparable[] aux = new Comparable[n]; 11 for(int i=0;i<n;i++){ //取左半邊sorted的元素至輔助數組,因為未來歸並左側位置可能會被右側元素占據 12 aux[i] = array[i]; 13 } 14 System.out.println(Arrays.toString(aux)); 15 int l = 0; 16 int r = n; 17 for(int k = 0; k<2*n;k++){
18 if(l >= n) break;//輔助元素數組全部用完,array右側不需要挪動位置了 19 else if(r>=2*n) array[k]=aux[l++];//array原右側元素全部放置合適位置,後面只需把輔助數組的元素挪到array右側 20 else if(less(array[r],aux[l])) array[k] = array[r++]; 21 else array[k] = aux[l++]; 22 } 23 } 24 25 public static void main(String[] args){ 26 int n = 10; 27 int[] subarray1 = new int[n]; 28 int[] subarray2 = new int[n]; 29 for (int i = 0; i < n; i++) { 30 subarray1[i] = StdRandom.uniform(100); 31 subarray2[i] = StdRandom.uniform(100); 32 } 33 Arrays.sort(subarray1); 34 Arrays.sort(subarray2); 35 Integer[] array = new Integer[2*n]; 36 for(int i = 0; i<n;i++){ 37 array[i] = subarray1[i]; 38 array[n+i] = subarray2[i]; 39 } 40 System.out.println(Arrays.toString(array)); 41 merge(array); 42 System.out.println(Arrays.toString(array)); 43 } 44 }

Coursera Algorithms week3 歸並排序 練習測驗1: Merging with smaller auxiliary array