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


首先利用归并排序算法对数组进行排序,时间复杂度为O(nlogn),接着再利用时间复杂度为O(n) 的去重复算法去掉数组中的重复元素。总的时间复杂度为O(nlogn)。
(这题应该用分支算法解决)以下为分支算法

代码不是分支算法
 package org.xiu68.ch02.ex2;
 public class Ex2_14 {
     //基于分治法的归并排序算法
     public static void main(String[] args) {
         int[] a=new int[]{5,5,4,4,3,3,3,2,2,1,1};
         //先归并排序数组,时间复杂度为O(nlog2n)
         mergeSort(a, a.length-1);
         int min=a[0]-1;
         //去掉有序数组中的重复元素,时间复杂度为O(n)
         removeSame(a);
         //总的时间复杂度为O(nlog2n)
         for(int i=0;i<a.length;i++){
             if(a[i]!=min)
                 System.out.print(a[i]+"  ");
         }
     }
     //一次归并,二并一
     public static void merge(int[] start,int[] result,int s,int m,int t){
         //s,m+1为两个有序序列的第一个记录,t为第二个序列的最后一个记录
         int i=s;
         int j=m+1;
         int k=s;
         while(i<=m && j<=t)
             if(start[i]<=start[j])          //取start[i]和start[j]的最小者放入result[k]
                 result[k++]=start[i++];
             else
                 result[k++]=start[j++];
         if(i<=m)        //第一个序列没有遍历完
             while(i<=m)
                 result[k++]=start[i++];
         else            //第二个序列没有遍历完
             while(j<=t)
                 result[k++]=start[j++];
     }
     //一趟排序,h为序列长度
     public static void mergePass(int[] start,int[] result,int n,int h){
         int i=0;
         while(i<=n-2*h+1){
             merge(start,result,i,i+h-1,i+2*h-1);
             i+=2*h;
         }
         if(i<n-h+1)
             merge(start,result,i,i+h-1,n);
         else
             for(int k=i;k<=n;k++)
                 result[k]=start[k];
     }
     //归并排序
     public static void mergeSort(int[] start,int n){
         int h=1;
         int[] result=new int[n+1];
         while(h<n){
             mergePass(start, result, n, h);
             h=2*h;
             mergePass(result, start, n, h);
             h=2*h;
         }
     }
     //去掉数组中重复的部分
     public static void removeSame(int[] a){
         int min=a[0]-1;                    //把数组中的重复部分设置为min
         for(int i=0;i<a.length;){
             int j=i+1;
             while(j<a.length && a[i]==a[j]){
                 a[j]=min;
                 j++;
             }
             i=j;
         }//for
     }
 }
Ex 2_14 去掉数组中所有重复的元素..._第二次作业的更多相关文章
- 利用js对象的特性,去掉数组中的重复项
		<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ... 
- javascript 返回数组中不重复的元素
		这是实现结构伪类type-of-type的部分代码: <script type="text/javascript"> var ret= ["span" ... 
- js中 在数组中删除重复的元素(自保留一个)
		例如:var student = [‘qiang’,’ming’,’tao’,’li’,’liang’,’you’,’qiang’,’tao’]; 第一种思路是:遍历要删除的数组arr, 把元素分别放 ... 
- (转)js在数组中删除重复的元素自保留一个(两种实现思路)
		例如:var student = [‘qiang','ming','tao','li','liang','you','qiang','tao']; 第一种思路是:遍历要删除的数组arr, 把元素分别放 ... 
- Ex 2_23 如果一个数组超过半数的元素都相同时,该数组被称为含有一个主元素..._第二次作业
		将数组A划分为两个数组A1和A2 ,各含有A的一半元素或一半多一个.若A中含有主元素x,则A1和A2中至少有一个数组含有主元素x,对A1和A2递归地计算有无主元素,若A只含有一个元素,则A的主元素就是 ... 
- 利用js对象的特性,去掉数组中的重复项
- js学习笔记之在数组中删除重复的元素自保留一个
		遍历要删除的数组arr, 把元素分别放入另一个数组tmp中,在判断该元素在arr中不存在才允许放入tmp中 <script type="text/javascript"> ... 
- JavaScript去除数组中的重复值
		用原型函数(prototype)可以定义一些很方便的自定义函数,实现各种自定义功能. Javascript 中的原型函数(prototype)的工作原理,在 javascript 中每次声明新函数的过 ... 
- 去掉有序数组中的重复元素 c/c++
		去掉有序数组中的重复元素: int RemoveDuplates(int A[], int nCnt) { ; ; , j = ; i < nCnt && j < nCnt ... 
随机推荐
- 使用wget命令下载JDK失败(文件特别小)
			问题RT: 我们在网页上下载的时候要点一下 “Accept License Agreement ” ,使用wget下载的时候也需要提交这个 accept,方法如下: wget --no-check-c ... 
- 自学python 4.
			1.li = ["alex","tom","mike","god","merffy"](1)a = ... 
- Install Ubuntu Server
			进入引导程序以后, 选择Install Ubuntu Server, 安装主菜单如下: 依次配置: 接着 https://www.youtube.com/watch?v=gqLaT01yei0 
- Python 生成requirement 使用requirements.txt安装类库
			快速生成requirement.txt的安装文件 (CenterDesigner) xinghe@xinghe:~/PycharmProjects/CenterDesigner$ pip freeze ... 
- Tomcat配置到JEE版eclipse中
			接我上篇文中的tomcat下载,及环境变量配置,http://blog.csdn.net/qq_40223688/article/details/79451468 这篇文章我就讲一下怎么把tomcat ... 
- jqGrid api 中文说明
			JQGrid是一个在jquery基础上做的一个表格控件,以ajax的方式和服务器端通信. JQGrid Demo 是一个在线的演示项目.在这里,可以知道jqgrid可以做什么事情. 下面是转自其他人b ... 
- Docker 扩容 容器空间大小 - 九
			Docker 扩容: 提前规划 : 一是从宿主机 配置磁盘格式 LVM 宿主机可以动态扩展: 二是 在容器上的扩容:默认是 100G .然后创建容器时候 挂载目录 或者直接池扩展: 默认 Docker ... 
- [C++]PAT乙级1003.	我要通过!(17/20)
			/* 1003. 我要通过!(20) “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错 ... 
- python之读写文件
			1. 读取文件数据,文件必须存在才可以读且如要读取的文件不和当前.py在同一个包下,需要特别指定此文件路径才行 f=open('test.txt',encoding='utf-8')#填写文件路径,打 ... 
- LinkedHashMap实现LRU缓存算法
			LinkedHashMap的get()方法除了返回元素之外还可以把被访问的元素放到链表的底端,这样一来每次顶端的元素就是remove的元素. 构造函数如下: public LinkedHashMap ... 
