2018.4.24 快排查找第K大】的更多相关文章

import java.util.Arrays; /* 核心思想:利用快排思想,先假定从大到小排序,找枢纽,枢纽会把大小分开它的两边,当枢纽下标等于k时, 即分了k位在它左边或右边,也就是最大或最小的排到了它的左边或右边了.那么那个枢纽就是要找的第k位了 */ public class SearchNumData { /* n为数组长度 k为要查找的第k大 */ public static int findKth(int[] a, int n, int K) { return findKth(a…
#include "iostream.h" using namespace std; int findMedian(int *A,int left,int right){ int center = (left+right)/2; if(A[left]>A[center]){ swap(A[left],A[center]); } if(A[left]>A[right]){ swap(A[left],A[right]); } if(A[center]>A[right]){…
int get_kth(int l,int r) { if (l==r) return a[r]; ]; while (i<j) { while (a[i]<mid) i++; while (a[j]>mid) j--; if (i<j) { swap(a[i],a[j]); i++; j--; } } if (k<=j) return get_kth(l,j); if (k>=i) return get_kth(i,r); }…
前言 半年前在极客时间订阅了王争的<数据结构和算法之美>,现在决定认真去看看.看到如何用快排思想在O(n)内查找第K大元素这一章节时发现王争对归并和快排的理解非常透彻,讲得也非常好,所以想记录总结一下.文章内容主要分析归并排序和快速排序原理,并根据它们共同的分治思想,引出如何在 O(n) 的时间复杂度内查找一个无序数组中的第 K 大元素? 归并排序原理 核心思想:将数组从中间分成前后两部分,然后对前后两部分分别进行排序,再将排序好的两个部分有序合并在一起,这样整个数组有序. 归并排序使用的就是…
快速排序 下面是之前实现过的快速排序的代码. function quickSort(a,left,right){ if(left==right)return; let key=partition(a,left,right);//选出key下标 if(left<key){ quickSort(a,left,key-1);//对key的左半部分排序 } if(key<right){ quickSort(a,key+1,right)//对key的右半部份排序 } } function partiti…
1. 小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪颗更重. 给定两颗钻石的编号g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第二个元素为较轻的钻石的编号.最后给定之前的比较次数n.请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法判断返回0.输入数据保证合法,不会有矛…
类快排 第一种方法 o(n) #include <bits/stdc++.h> using namespace std; const int N = 1000; int s[N]; int partion(int l,int r) { int tmp = s[l]; int i = l, j = r; while(i < j) { while(i < j && s[j] >= tmp) j--; while(i < j && s[i] &…
传送门 The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8690   Accepted: 2847 Description Newman likes playing with cats. He possesses lots of cats in his home. Because the number of cats is really huge, Newman wants…
这种题一般是给定N个数,然后N个数之间通过某种计算得到了新的数列,求这新的数列的第K大的值 POJ3579 题意: 用$N$个数的序列$x[i]$,生成一个新序列$b$. 新的序列定义为:对于任意的$ i$,$j$且 $i != j $有$b[] = abs(x[i] - x[j])$ 问新序列的中位数是什么,如果新序列的长度为偶数那么我们定义中位数为排序后第len/2位置的那个数 解法: 相当于问新序列中的第K大的数多少. 注意新数列不可能全都算出来. 二分答案,二分那个第K大的数的值. $x…
done {20-01-30 12:56} ref: https://blog.csdn.net/fengsigaoju/article/details/50728588 note: void quicksort(int a[],int left,int right,int k) { int i,j,key,low,high; low=left; high=right; key=a[left]; if (left<right) { while(low<high) { //hplc ; high…