力扣-9.29

 ![在这里插入图片描述](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);
	}
}

猜你喜欢

转载自blog.csdn.net/Desperate_gh/article/details/108869111