中值排序的java实现
public class MidSort {
public static void main(String[] args){
int[] arr={,,,,,,,,};
midSort(arr,,);
for(int i:arr){
System.out.print(i + " ");
}
System.out.println();
}
//返回数组被中值分成两堆后中值所在位置
public static int partition(int[] goal,int left,int right,int midPos){//left和right是为位置指示,表明你要排序的是
// 数组的那部分,否则要把待排序的数组切割出来
int mid=goal[midPos];
int tmp,idx;
//把中值移到数组末尾
tmp=goal[right];
goal[right]=goal[midPos];
goal[midPos]=tmp;
int smallPos=left;//指向比中值小的,每当有比中值小的数把它放入smallPos所指地方,然后smallPos+1,这样保证
//smallPos指过的位置都放着比中值小的(也就是在最前面的那些)
for(idx=left;idx<right;idx++){
if(goal[idx]<mid){//每当有比中值小的数把它放入smallPos所指地方,从而把小于中值的移到前面去
tmp=goal[idx];
goal[idx]=goal[smallPos];
goal[smallPos]=tmp;
smallPos++;
}
}
//把中值放回它应该在的位置
tmp=goal[right];
goal[right]=goal[smallPos];
goal[smallPos]=tmp;
return smallPos;//返回中值所在位置
}
//因为选值来作为中值是随机的(有时是以第一个来作为),所以被分成两堆的数组可能不均衡,所有找出第k(此时k=(length+1)/2)
// 便使分堆后的数组平衡了)大的元素的位置
public static int selectKth(int[] goal,int left,int right, int k){//返回第K大元素
int midPos=selectMidPos(goal,left,right);//返回作为中值的为元素的位置,若是选数组第一个作为中值时有时会让性能
//退化成O(n的平方)(如它是最大、小值时,分堆后会有一堆为空),要避免
//会在数组中随机选一个作为中值
int pos=partition(goal,left,right,midPos);//数组被中值分成两堆后中值所在位置
if(pos==k+left-){//说明真正想要作为分堆的中值恰好就是之前选定分堆的中值
return pos;
}else if(k+left-<pos){//小于,如k是第4大,之前是第3大,所以小于,继续分堆直到返回k为止因为此时数组才按k作为中值来分堆
//所以第K大元素在在之前分好堆中的左边那堆,它在这堆是第k-pos大
return selectKth(goal,left,pos-,k);
}else{//大于,所以第K大元素在在之前分好堆中的右边那堆,它在这堆是第k大
return selectKth(goal,pos+,right,k-(pos-left+));
}
}
public static void midSort(int[] goal,int left,int right){
if (left>=right)return;//如果只有一个元素或更少
int mid=(right-left+)/;
int midPos=selectKth(goal,left,right,mid+);//得到能把数组分为平均两堆的中值的位置且此时已分好堆
midSort(goal,left,left+mid-); //对左边这堆继续分堆
midSort(goal,left+mid+,right); //对右边这堆继续分堆
}
public static int selectMidPos(int[] goal,int left,int right){
//随机选定中值
int distant =right-left+;
int random=(int)Math.round(Math.random()*distant);
int pos=random+left<=right?random+left:random+left-;
return pos;
}
}
中值排序的java实现的更多相关文章
- opencv-11-中值滤波及自适应中值滤波
开始之前 在上一篇我们实现了读取噪声图像, 然后 进行三种形式的均值滤波得到结果, 由于我们自己写的均值滤波未作边缘处理, 所以效果有一定的下降, 但是总体来说, 我们得到的结果能够说明我们的算法执行 ...
- Java中Map<Key, Value>存储结构根据值排序(sort by values)
需求:Map<key, value>中可以根据key, value 进行排序,由于 key 都是唯一的,可以很方便的进行比较操作,但是每个key 对应的value不是唯一的,有可能出现多个 ...
- Java中的排序算法(2)
Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...
- Java-->把txt中的所有字符按照码表值排序
--> List 列表中的自动添加的多余空间长度该怎么去除呢?...(已解决,是char 数组中的空字符) package com.dragon.java.filesort; import ja ...
- php usort 按照数组中的某个键值排序
//php usort 按照数组中的某个键值排序 如果第一个参数小于第二个参数 -> 返回小于0的整数如果第一个参数等于于第二个参数 -> 返回等于0的整数如果第一个参数大于于第二个参数 ...
- Java中值传递和引用传递的概念
很多书中都提到了在Java中只存在值传递,但是今天在一个NanoHTTPD的源码中看到这样一段: if (qmi >= 0) { decodeParms(uri.substring(qmi + ...
- java中值类型和引用类型的区别
[定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值,那么调用这个方法是传入的变量的值也将改变. 值类型表示复制一个当前变量传给方法,当你 ...
- Java集合中对象排序
集合中的对象排序需求还是比較常见的.当然我们能够重写equals方法,循环比較:同一时候Java为我们提供了更易使用的APIs.当须要排序的集合或数组不是单纯的数字型时,通常能够使用Comparato ...
- Comparable与Comparator,java中的排序与比较
1:比较和排序的概念 比较:两个实体类之间按>,=,<进行比较. 排序:在集合类中,对集合类中的实体进行排序.排序基于的算法基于实体类提供的比较函数. 基本型别都提供了默认的比较算法,如s ...
随机推荐
- Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
今天碰到了一个查询异常问题,上网查了一下,感谢原创和译者 如果你使用的数据库连接类是 the Data Access Application Blocks "SqlHelper" ...
- openStack镜像制作
参考链接: https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/OpenStack/page/Creating ...
- C++中的RTTI机制解析
RTTI RTTI概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型. RTTI ...
- win7出现无法连接到代理服务器的错误,不能上网的问题的解决
今天晚上突然停电,等我打开电脑发现不然上网,用google浏览器出现这个错误: 用IE诊断错误如下: 说是不能连到代理服务器,但是我没有连接到代理服务器啊,但是我的QQ能登,就是不能用浏览器上网,经过 ...
- JavaScript高级程序设计笔记之面向对象
说起面向对象,大部分程序员首先会想到 类 .通过类可以创建许多具有共同属性以及方法的实例或者说对象.但是JavaScript并没有类的概念,而且在JavaScript中几乎一切皆对象,问题来了,Jav ...
- iOS nib file owner
nib文件中的file owner属性,设定后app在运行时加载nib文件的过程中会通过file owner重新建立nib文件中描述的控件与其在file owner中对应的IBOutlet或IBAct ...
- docker网络配置之自定义网桥
使用特定范围的 IP (仅适用于v1.x)不适用于新版的v1.1x Docker 会尝试寻找没有被主机使用的 ip 段,尽管它适用于大多数情况下,但是它不是万能的,有时候我们还是需要对 ip 进一步规 ...
- C/C++关键字 extern
1.基本解释:extern 可置于变量或函数前面,表示变量或函数的定义在别的文件中,以提示编译器遇到此变量或函数时在其他模块中寻找定义. extern还有另外2个作用.第一:与“C”连用时,如 ext ...
- 实践一:Linux基础实践
一.Linux基础实践 1.1 1. 掌握软件源的维护方法,配置系统使用软件源镜像.掌握通过软件源来查找,安装,卸载,更新软件的方法. 这部分内容在许多学长学姐的报告里都有很详细的讲解,我在此就不赘述 ...
- Linux 夸平台 移植 Win32
1.代码格式 大量的 警告 不识别的字符(936),请保存为unicode 以免丢失数据,好多参考说忽略此警告. 但是很多错误都是由于这个警告引起的.将大量的.h .cpp 的utf 8 数据用txt ...