首先利用归并排序算法对数组进行排序,时间复杂度为O(nlogn),接着再利用时间复杂度为O(n) 的去重复算法去掉数组中的重复元素。总的时间复杂度为O(nlogn)。
(这题应该用分支算法解决)以下为分支算法
代码不是分支算法
1 package org.xiu68.ch02.ex2; 2 3 public class Ex2_14 { 4 //基于分治法的归并排序算法 5 public static void main(String[] args) { 6 7 int[] a=new int[]{5,5,4,4,3,3,3,2,2,1,1}; 8 9 //先归并排序数组,时间复杂度为O(nlog2n) 10 mergeSort(a, a.length-1); 11 int min=a[0]-1; 12 13 //去掉有序数组中的重复元素,时间复杂度为O(n) 14 removeSame(a); 15 16 //总的时间复杂度为O(nlog2n) 17 for(int i=0;i<a.length;i++){ 18 if(a[i]!=min) 19 System.out.print(a[i]+" "); 20 } 21 22 } 23 24 25 //一次归并,二并一 26 public static void merge(int[] start,int[] result,int s,int m,int t){ 27 //s,m+1为两个有序序列的第一个记录,t为第二个序列的最后一个记录 28 int i=s; 29 int j=m+1; 30 int k=s; 31 32 while(i<=m && j<=t) 33 if(start[i]<=start[j]) //取start[i]和start[j]的最小者放入result[k] 34 result[k++]=start[i++]; 35 else 36 result[k++]=start[j++]; 37 38 if(i<=m) //第一个序列没有遍历完 39 while(i<=m) 40 result[k++]=start[i++]; 41 42 else //第二个序列没有遍历完 43 while(j<=t) 44 result[k++]=start[j++]; 45 } 46 47 //一趟排序,h为序列长度 48 public static void mergePass(int[] start,int[] result,int n,int h){ 49 int i=0; 50 while(i<=n-2*h+1){ 51 merge(start,result,i,i+h-1,i+2*h-1); 52 i+=2*h; 53 } 54 if(i<n-h+1) 55 merge(start,result,i,i+h-1,n); 56 else 57 for(int k=i;k<=n;k++) 58 result[k]=start[k]; 59 } 60 61 //归并排序 62 public static void mergeSort(int[] start,int n){ 63 int h=1; 64 int[] result=new int[n+1]; 65 while(h<n){ 66 mergePass(start, result, n, h); 67 h=2*h; 68 mergePass(result, start, n, h); 69 h=2*h; 70 } 71 } 72 73 //去掉数组中重复的部分 74 public static void removeSame(int[] a){ 75 int min=a[0]-1; //把数组中的重复部分设置为min 76 for(int i=0;i<a.length;){ 77 int j=i+1; 78 while(j<a.length && a[i]==a[j]){ 79 a[j]=min; 80 j++; 81 } 82 i=j; 83 }//for 84 } 85 86 87 }