题目

:::info

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素


来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 ::: image.png

代码

  1. class Solution {
  2. public int findKthLargest(int[] nums, int k) {
  3. int length = nums.length; //获取数组长度
  4. bubbleSort(nums); //对数组做升序排序
  5. return nums[length - k];
  6. }
  7. //冒泡排序
  8. public static void bubbleSort(int[] arr){
  9. for (int i = 0; i < arr.length - 1; i++) {
  10. for (int j = 0; j < arr.length - i - 1; j++) {
  11. int tmp = 0;
  12. if (arr[j] > arr[j+1]){
  13. tmp = arr[j+1];
  14. arr[j+1] = arr[j];
  15. arr[j] = tmp;
  16. }
  17. }
  18. }
  19. }
  20. //优化冒泡排序
  21. public static void optimalBubbleSort(int[] arr){
  22. int lastExchangeIndex = 0; //记录最后一次交换的位置
  23. int sortBorder = arr.length - 1; //无序数列的边界
  24. for (int i = 0; i < arr.length - 1; i++) {
  25. boolean isSorted = true; //有序标记,当一轮循环元素无交换时为true
  26. for (int j = 0; j < sortBorder; j++) {
  27. int tmp = 0;
  28. if (arr[j] > arr[j+1]){
  29. tmp = arr[j];
  30. arr[j] = arr[j+1];
  31. arr[j+1] = tmp;
  32. isSorted = false; //元素位置发生改变
  33. lastExchangeIndex = j; //记录最后一次交换的位置
  34. }
  35. }
  36. sortBorder = lastExchangeIndex;
  37. if (isSorted)break; //当元素位置不发生变化时,说明此时已经有序
  38. }
  39. }
  40. }