1、来源:点击打开链接
2、题目:
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.
For example,
Given [3,2,1,5,6,4]
and k = 2, return 5.
Note:
You may assume k is always valid, 1 ≤ k ≤ array's length.
4、下面暴力破解既然能通过。。。:
public class Solution {
public int findKthLargest(int[] nums, int k) {
int i,j,n=nums.length;
for(i=0;i<n-1;i++){
for(j=0;j<n-1-i;j++){
if(nums[j]<nums[j+1]){
int t=nums[j];
nums[j]=nums[j+1];
nums[j+1]=t;
}
}
}
return nums[k-1];
}
}
5、堆排序(用c语言打败了65%,好高兴,啊哈哈哈):
A、设n个节点,不管第n个节点(即最后一个节点)为左子节点还是右子节点,n的父节点都为i=n/2-1
B、维基百科是极好的东西啊:点击打开链接
int findKthLargest(int* nums, int numsSize, int k) {
int i,j,n=numsSize;
//初始化为最大堆,i=n/2-1的意思i是n的父节点
for(i=n/2-1;i>=0;i--){
heapSort(nums,i,n-1);
}
//逐个将最大堆的堆顶放到数组末,然后对数组前面的堆进行重新排序
for(i=n-1;i>0;i--){
swap(&nums[0],&nums[i]);
heapSort(nums,0,i-1);
}
//for(i=0;i<n;i++)
// printf("%d,",nums[i]);
return nums[n-k];
}
void swap(int *a,int *b){
int temp=*a;
*a=*b;
*b=temp;
}
void heapSort(int *nums,int start,int end){
int dad=start;
int son=2*dad+1;
while(son<=end){
//在左右节点中选出大的节点
if(son+1<=end){
if(nums[son]<nums[son+1])
son++;
}
//将大的子节点和父节点比较,如果父节点大直接返回,否则交换他们的值,并进行父节点=子节点运算
if(nums[son]<=nums[dad])
return;
else{
swap(&nums[son],&nums[dad]);
dad=son;
son=2*dad+1;
}
}
}
6、下图为堆排序中,数字顺序的变化过程
7、堆排序参考:打开维基百科
8、快速排序代码:
int findKthLargest(int* nums, int numsSize, int k) {
quickSort(nums,0,numsSize-1);
//for(int i=0;i<numsSize;i++)
// printf("%d,",nums[i]);
return nums[numsSize-k];
}
void quickSort(int *nums,int start,int end){
int i=start,j=end,key=nums[start];
//一轮排序
while(i<j){
while(i<j&&nums[j]>=key) j--;
if(i<j)
nums[i]=nums[j];
while(i<j&&nums[i]<=key) i++;
if(i<j)
nums[j]=nums[i];
}
nums[i]=key;
//再分别对左右边进行排序
if(i-1>start)
quickSort(nums,start,i-1);
if(i+1<end)
quickSort(nums,i+1,end);
}
注:暴力破解363ms,java;堆排序12ms,c;快排156ms,c。