編寫一個程序解決選擇問題。令k=N/2。


import java.util.Arrays;

/**
* 選擇問題,確定N個數中第K個最大值
* @author wulei
* 將前k個數讀進一個數組,冒泡排序(遞減),再將剩下的元素逐個讀入,
* 如果新元素小於第K個元素,忽略,否則將新元素插入正確的位置,並移除原第K個元素。
*/
public class SelectTest {

//public static final Random RANDOM = new Random(3);
//3為隨機數種子,當種子相同的時候,每次隨機生成的數都一樣。
//RANDOM.nextInt(100) 生成0到100的整數。

//冒泡
public static void sort(int[] arr){
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-i-1; j++) {
if(arr[j] < arr[j+1]){
int x = arr[j];//TODO 測試new基本類型的性能,待會兒放到全局
arr[j] = arr[j+1];
arr[j+1] = x;
}
}
}
}

public static int selectK(int[] arr,int k){
int[] kArr = Arrays.copyOf(arr, k);
sort(kArr);
for (int i = k; i < arr.length; i++) {
if(arr[i] > kArr[k-1]){
kArr[k-1] = kArr[k-2];
for (int j = k-2; j >= 0; j--) {
if(kArr[j] > arr[i]){
kArr[j+1] = arr[i];//復雜問題簡單化:如果新元素比a[j]小,那么在a[j]后面,大,那么占用a[j]
break; //的位置,但需要先將a[j]往后移。
}else{
kArr[j+1] = kArr[j];
kArr[j] = arr[i];
}
}
}
}
return kArr[k-1];
}

public static void main(String[] args){
int[] arr = new int[]{3,2,1,9,0,0,0,0,0,10,11,8};
long start = System.currentTimeMillis();
int ka = selectK(arr, 3);
System.out.println("time:"+(System.currentTimeMillis()-start));
System.out.println(Arrays.toString(arr));
System.out.println(ka);
}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM