第k个元素

打印 上一主题 下一主题

主题 865|帖子 865|积分 2595

标题

以尽量高的服从求出一个乱序数组中按数值顺序的第k个元素值
解法1

以arr={10,9,8,7,6,5,4,3,2,1},k=4的情况举例:
先选择一个候选中值6,比它小的放在它的左边,比它大的放在它的右边,那么该候选中值的排名可以知道是6。那么第4个元素在左边。

再在左边选一个候选中值2,,比它小的放在它的左边,比它大的放在它的右边,arr={1,2,5,3,4,6,10,7,8,9}。候选中值的排名是2,那么第4个元素在它的右边。
  1. package com.company;
  2. import com.company.util.ArrayUtil;
  3. import java.util.Arrays;
  4. public class Test21 {
  5.     /*第k个元素的左边k-1个元素都比它小,右边的元素都比它大*/
  6.     public static void main(String[] args) {
  7.         int k=4;
  8. //        int[] arr={4, 6, 7, 0, 6, 4, 1, 0, 0, 10};
  9.         int[] arr = ArrayUtil.randomArray(0, 11, 10);
  10.         System.out.println(Arrays.toString(arr));
  11.         System.out.println(find(arr, 0, arr.length - 1, k));
  12.         Arrays.sort(arr);
  13.         System.out.println(Arrays.toString(arr));
  14.     }
  15.     public static int find(int[] arr,int left,int right,int k){
  16.         /*if (left>right){
  17.             return -1;
  18.         }*/
  19.         int mid=(left+right)/2;
  20.         //排序arr[left] arr[mid] arr[right]可能右重复
  21.         int maxIndex=left;
  22.         int minIndex=left;
  23.         if(arr[mid]<arr[minIndex]){
  24.             minIndex=mid;
  25.         }
  26.         if(arr[right]<arr[minIndex]){
  27.             minIndex=right;
  28.         }
  29.         if(arr[mid]>arr[maxIndex]){
  30.             maxIndex=mid;
  31.         }
  32.         if(arr[right]>arr[maxIndex]){
  33.             maxIndex=right;
  34.         }
  35.         int midIndex=(left+right+mid)-(maxIndex+minIndex);
  36.         System.out.println(midIndex);
  37.         ArrayUtil.swap(arr,midIndex,left);
  38.         System.out.println(Arrays.toString(arr));
  39.         int j=right;
  40.         int i=0;
  41.         for ( i = left+1; i <j ; i++) {
  42.             if(arr[i]>arr[left]){
  43.                 while(j>i){
  44.                     if(arr[j]<=arr[left]){
  45.                         ArrayUtil.swap(arr,i,j);
  46.                         break;
  47.                     }
  48.                     j--;
  49.                 }
  50.             }
  51.         }
  52.         ArrayUtil.swap(arr,left,i-1);
  53.         System.out.println(Arrays.toString(arr));
  54.         if(arr[j]<=arr[left]){
  55.             ArrayUtil.swap(arr,left,j);
  56.         }
  57.         if(i==k){
  58.             return arr[i-1];
  59.         }else if(i<k){
  60.             return find(arr,i,right,k);
  61.         }else{
  62.             return find(arr,left,i-2,k);
  63.         }
  64.     }
  65. }
复制代码
解法2

先排序,再找出第k个元素。代码略。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表