算法:寻找第K小元素
2016-01-03 09:32
190 查看
使用从一端走的快速排序的寻找第K小元素:(注意)
1.在进行一次循环时的两种交换元素顺序①a[j]<key时②j>right时
2.何时递归,何时返回数据,左右递归的判断,递归的参数。
public class FindKth {
public static void main(String[] args) {
int A[] = {5,3,-4,-1,2,-2,-3,1};
FindK fk = new FindK();
System.out.println(fk.findKth(A, 1));
System.out.println(fk.findKth(A, 2));
System.out.println(fk.findKth(A, 3));
System.out.println(fk.findKth(A, 4));
System.out.println(fk.findKth(A, 5));
System.out.println(fk.findKth(A, 6));
System.out.println(fk.findKth(A, 7));
System.out.println(fk.findKth(A, 8));
}
}
class FindK{
int temp = 0;
public int findKth(int A[],int k){
int left = 0;
int right = A.length-1;
int key = quickFindKey(A,left,right,k);
return key;
}
private int quickFindKey(int[] a, int left, int right, int k) {
int key = a[left];
int i = left;
for(int j = left + 1;j<=right;j++){
if(a[j]<key){
i = i + 1;
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
temp = a[i];
a[i] = key;
a[left] = temp;
if((i + 1) == k){
return a[i];
}else if((i+1)<k){
return quickFindKey(a, i+1, right, k);
}else if((i+1)>k){
return quickFindKey(a, left, i,k);
}else{
return -100;
}
}
}
1.在进行一次循环时的两种交换元素顺序①a[j]<key时②j>right时
2.何时递归,何时返回数据,左右递归的判断,递归的参数。
public class FindKth {
public static void main(String[] args) {
int A[] = {5,3,-4,-1,2,-2,-3,1};
FindK fk = new FindK();
System.out.println(fk.findKth(A, 1));
System.out.println(fk.findKth(A, 2));
System.out.println(fk.findKth(A, 3));
System.out.println(fk.findKth(A, 4));
System.out.println(fk.findKth(A, 5));
System.out.println(fk.findKth(A, 6));
System.out.println(fk.findKth(A, 7));
System.out.println(fk.findKth(A, 8));
}
}
class FindK{
int temp = 0;
public int findKth(int A[],int k){
int left = 0;
int right = A.length-1;
int key = quickFindKey(A,left,right,k);
return key;
}
private int quickFindKey(int[] a, int left, int right, int k) {
int key = a[left];
int i = left;
for(int j = left + 1;j<=right;j++){
if(a[j]<key){
i = i + 1;
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
temp = a[i];
a[i] = key;
a[left] = temp;
if((i + 1) == k){
return a[i];
}else if((i+1)<k){
return quickFindKey(a, i+1, right, k);
}else if((i+1)>k){
return quickFindKey(a, left, i,k);
}else{
return -100;
}
}
}
相关文章推荐
- Adb connection Error:远程主机强迫关闭一个现有的连接--解决方法
- 使用mysqldump导入导出含BOLB数据的表
- VMware虚拟网络之VMnet0、VMnet1、VMnet8
- Directshow使用ffmpeg构建解码filter
- 开园记
- STL algorithm算法minmax,minmax_element(36)
- java源文件名与类名的关系
- ActionBar 不能显示logo 的问题 ,背景颜色的修改, 以及ActionBar 的官方guide
- 2440中断向量表
- 第十四周 验证算法——折半查找
- codevs 2494 Vani和Cl2捉迷藏
- 【LWJGL2 WIKI】【基础篇】基础4:计时
- CentOS启动流程
- C++ 构造与析构函数
- x265探索与研究(三):如何播放*.265格式的视频或解码视频流
- template<class T>(转)
- x265探索与研究(三):如何播放*.265格式的视频或解码视频流
- jitsi-meet
- inline内联函数(转)领教了
- 蓝桥杯-大臣的旅费(DFS)