區間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]);
   }
  }
 }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章