Ex 2_14 去掉数组中所有重复的元素..._第二次作业

       首先利用归并排序算法对数组进行排序,时间复杂度为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 }
View Code
原文地址:https://www.cnblogs.com/xiu68/p/7989292.html