215. Kth Largest Element in an Array 暴力-堆排序-快速排序

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.

3、思路:排序,返回第k大的数即可;

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。