• 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
  • 相关阅读:
    Python装饰器学习(九步入门)
    jQuery练习题
    JavaScript 练习题
    Apache的安装与下载
    非常好用的CSS样式重置表
    表单练习
    shell命令lsof
    IndentationError: unindent does not match any outer indentation level
    Zabbix监控mysql主从复制状态
    Zabbix监控php-fpm status
  • 原文地址:https://www.cnblogs.com/xiu68/p/7989292.html
Copyright © 2020-2023  润新知