![在这里插入图片描述](https://img-blog.csdnimg.cn/20200929151813873.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0Rlc3BlcmF0ZV9naA==,size_16,color_FFFFFF,t_70#pic_center)
方法一:
快排代码:
public class test_quick_test {
private static int partition(int[] nums,int s,int e){
int x=nums[s];
while(s<e){
while(s<e && nums[e]>=x){
e--;
}
if(s<e){
nums[s]=nums[e];
}
while(s<e && nums[s]<x){
s++;
}
if(s<e){
nums[e]=nums[s];
}
}
nums[s]=x;
return s;
}
private static void quick_sort(int[] nums,int s,int e) {
if(s<e) {
int i=partition(nums, s, e);
quick_sort(nums, s, i-1);
quick_sort(nums, i+1, e);
}
}
public static void main(String[] args) {
int[] nums= {
9,8,7,6,5,4,3,2,1};
int e=nums.length;
quick_sort(nums,0,e-1);
for(int num:nums) {
System.out.println(num);
}
}
}
先进行快排,然后直接返回第k大的数:
class Solution {
private static int partition(int[] nums,int s,int e){
int x=nums[s];
while(s<e){
while(s<e && nums[e]>=x){
e--;
}
if(s<e){
nums[s]=nums[e];
}
while(s<e && nums[s]<x){
s++;
}
if(s<e){
nums[e]=nums[s];
}
}
nums[s]=x;
return s;
}
private static void quick_sort(int[] nums,int s,int e) {
if(s<e) {
int i=partition(nums, s, e);
quick_sort(nums, s, i-1);
quick_sort(nums, i+1, e);
}
}
public int findKthLargest(int[] nums, int k) {
quick_sort(nums,0,nums.length-1);
return nums[nums.length-k];
}
}
改进版:
快排确定一个元素的位置后,看看是否是第k大的元素,如果是,直接返回,如果不是,则在该元素的左边或者右边继续快排
class Solution {
private static int partition(int[] nums,int s,int e){
int x=nums[s];
while(s<e){
while(s<e && nums[e]>=x){
e--;
}
if(s<e){
nums[s]=nums[e];
}
while(s<e && nums[s]<x){
s++;
}
if(s<e){
nums[e]=nums[s];
}
}
nums[s]=x;
return s;
}
private static int quick_sort(int[] nums,int s,int e,int k) {
if(s<e) {
int i=partition(nums, s, e);
if(i==(nums.length-k)){
return nums[i];
}else if(i<(nums.length-k)){
return quick_sort(nums, i+1, e,k);
}else{
return quick_sort(nums, s, i-1,k);
}
}
return nums[s];
}
public int findKthLargest(int[] nums, int k) {
return quick_sort(nums,0,nums.length-1,k);
}
}
补:
在Java里:
length方法用于获取数组的长度。
int[] arr = new int[10];
System.out.println(arr.length);
而length()用于获取String字符串中字符的个数。
String str = "HelloJava";
System.out.println(str.length());
方法二:
堆排序代码:
public class test_heap_sort {
public static void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
public static void sift(int[] nums,int low,int high) {
int i=low,j=low*2+1;
int temp=nums[i];
while(j<=high) {
if(j<high && nums[j]<nums[j+1]) {
j++;
}
if(temp<nums[j]) {
nums[i]=nums[j];
i=j;
j=i*2+1;
}
else break;
}
nums[i]=temp;
}
public static void HeapSort(int[] nums) {
int heapSize=nums.length;
for(int i=(heapSize/2)-1;i>=0;i--) {
sift(nums,i,heapSize-1);
}
for(int i=heapSize-1;i>=1;i--) {
swap(nums,0,i);
sift(nums, 0, i-1);
}
}
public static void main(String[] args) {
int[] nums= {
9,8,7,6,5,4,3,2,1};
HeapSort(nums);
for(int num:nums) {
System.out.println(num);
}
}
}
class Solution {
public static void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
public static void sift(int[] nums,int low,int high) {
int i=low,j=low*2+1;
int temp=nums[i];
while(j<=high) {
if(j<high && nums[j]<nums[j+1]) {
j++;
}
if(temp<nums[j]) {
nums[i]=nums[j];
i=j;
j=i*2+1;
}
else break;
}
nums[i]=temp;
}
public static int HeapSort(int[] nums,int k) {
int t=1;
int heapSize=nums.length;
for(int i=(heapSize/2)-1;i>=0;i--) {
sift(nums,i,heapSize-1);
}
for(int i=heapSize-1;i>=1;i--) {
if(t==k) {
return nums[0];
}
swap(nums,0,i);
sift(nums, 0, i-1);
t++;
}
return nums[0];
}
public static int findKthLargest(int[] nums, int k) {
return HeapSort(nums,k);
}
}