区间k大数查询

  1. 问题描述  
  2. 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。  
  3.   
  4. 输入格式  
  5. 第一行包含一个数n,表示序列长度。  
  6.   
  7. 第二行包含n个正整数,表示给定的序列。  
  8.   
  9. 第三个包含一个正整数m,表示询问个数。  
  10.   
  11. 接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。  
  12.   
  13. 输出格式  
  14. 总共输出m行,每行一个数,表示询问的答案。  
  15. 样例输入  
  16. 5  
  17. 1 2 3 4 5  
  18. 2  
  19. 1 5 2  
  20. 2 3 2  
  21. 样例输出  
  22. 4  
  23. 2  
  24. 数据规模与约定  
  25. 对于30%的数据,n,m<=100;  
  26.   
  27. 对于100%的数据,n,m<=1000;  
  28.   
  29. 保证k<=(r-l+1),序列中的数<=10de6次方。  
  30. */  

package com.jiajia.six;

import java.util.Scanner;

/**
 *
 * @author J.J.F
 *
 */
public class Count1 {
 public static void main(String[] args) {
  Count1 c = new Count1();
  
  c.Q_Sort();
 }
 /**
  * 下面开始写一个快速排序的算法
  * @return
  */
 public int Split(int[]data,int pre,int rear){
  /*
   * 这个函数的功能是返回新的中间下标
   */
  int value = data[pre];//最前面的数
  while(pre<rear){//前后下标保持正确的位置
   while(data[rear]<=value&&pre<rear)//后面的大于前面的
    rear--;//将后面的下标向前移动一个知道后面的小于前面的
   data[pre] = data[rear];//将后面的小的,放在最前面
   while(data[pre]>value&&pre<rear)//对前面的进行从新的排序,
    pre++;
   data[rear] = data[pre];
  }
  data[pre] = value;
  return pre;//返回的数据
 }
 /**
  *开始写快速排序算法
  */
 public void QuickSort(int[]data,int pre,int rear){
  /*
   * 实现递归的排序
   */
  if(pre<rear){
   int mid = Split(data, pre, rear);
   QuickSort(data, pre, mid-1);
   QuickSort(data, mid+1, rear);
  }
 }
 public void Q_Sort(){
  Scanner scanner = new Scanner(System.in);
  int i;
  int n = scanner.nextInt();
  int[] data = new int[n];
  for(i = 0;i<n;i++){
   data[i] = scanner.nextInt();
  }
  int m =scanner.nextInt();//表示寻找几个数
  int a[] = new int[m*3];//保存要寻找m个参数,每个要寻找的数三个参数
  for(i = 0;i<m*3;i++){
   a[i] = scanner.nextInt();
  }
  int []temp;
  for(i = 0;i<m;i++){//开始对要查找的数进行查找
   if(a[i*3]<=n&&a[i*3+1]<=n&&a[i*3]<=a[i*3+1]&&a[i*3+2]<=(a[i*3+1]-a[i*3])){//给出的数据必须正确,
    int len = a[i*3+1]-a[i*3];
    temp = new int[len];
    for(int j = 0;j<len;j++){
     temp[j] = data[a[i*3]+j-1];
    }
    QuickSort(temp, 0,len-1);
    System.out.println(temp[a[i*3+2]-1]);
   }
  }
 }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章