検索と並べ替えの演習の概要(1)検索と並べ替えの演習の概要
(3)
質問1:配列の順序を調整します。奇数は左側、偶数は右側です。
奇数が偶数の前になるように配列の順序を調整します。整数配列を入力します。配列内の番号の順序を調整して、すべての奇数が配列の前半にあり、すべての偶数が配列の半分の部分の後ろにあるようにします。必要な時間計算量はO(n)です。
(クイックソートのアイデアを使用)
import java.util.Scanner;
public class LianXi {
public static void quickSort(int []A, int p, int r){
if(p<r){
int q = partition2(A, p, r);
quickSort(A, p, q-1);
quickSort(A, q+1, r);
}
}
public static int partition2(int[]A, int p, int r){
int left = p + 1;
int right = r;
while(left <= right){
while(left <= right && A[left]%2 != 0){
left++;
}
while(left <= right && A[right]%2 == 0){
right--;
}
if(left < right)
swap(A, left, right);
}
swap(A, p, right);
return right;
}
public static void swap(int[] A, int left, int right) {
int temp = A[left];
A[left] = A[right];
A[right] = temp;
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int []A = new int[N];
for(int i = 0; i<N; i++){
A[i] = in.nextInt();
}
System.out.println("初始数组为:");
for(int i = 0; i<N; i++){
System.out.print(A[i] + " ");
}
System.out.println("\n");
quickSort(A,0,N-1);
System.out.println("排序后数组为:");
for(int j = 0; j<N; j++){
System.out.print(A[j] + " ");
}
}
}
質問2:
k番目に小さい数値可能な限り高い効率を使用して、ランダムな配列のk番目の要素の値を番号順に見つけます。
import java.util.Scanner;
public class LianXi {
public static int selectK(int []A, int p, int r, int k){
int q = partition2(A, p, r); //主元的下标
int qk = q - p + 1; //主元是第几个元素
if(qk == k){
return A[q];
}
else if(qk > k){
return selectK(A, p, q-1, k);
}
else
return selectK(A, q+1, r, k - qk);
}
public static int partition2(int[]A, int p, int r){
int pivot = A[p];
int left = p + 1;
int right = r;
while(left <= right){
while(left <= right && A[left] <= pivot){
left++;
}
while(left <= right && A[right] > pivot){
right--;
}
if(left < right)
swap(A, left, right);
}
swap(A, p, right);
return right;
}
public static void swap(int []A, int left, int right){
int temp = A[left];
A[left] = A[right];
A[right] = A[temp];
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int []A = new int[N];
for(int i = 0; i < N; i++){
A[i] = in.nextInt();
}
System.out.println("初始数组为:");
for(int i = 0 ; i<N; i++){
System.out.print(A[i] + " ");
}
System.out.println("\n");
System.out.println("请输入k");
int k = in.nextInt();
int t = selectK(A, 0, N, k);
System.out.println("结果为:" + t);
}
}
質問3:数値の
半分以上。配列の長さの半分以上に表示される数値が配列にあります。この数値を見つけてください。
(ソート後、配列の半分の長さの添え字に対応する要素を見つけます)
import java.util.Arrays;
import java.util.Scanner;
public class LianXi {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int []A = new int[N];
for(int i = 0; i<N; i++){
A[i] = in.nextInt();
}
System.out.println("初始数组为:");
for(int i = 0; i<N; i++){
System.out.print(A[i] + " ");
}
System.out.println("\n");
Arrays.sort(A);
System.out.println("结果为:");
System.out.println(A[A.length / 2]);
}
}
質問4:使用可能な最小のID
は、負でない配列(順序が正しくない)で割り当て可能な最小のIDを見つけます(番号付けは1から始まります)
解決策1:並べ替えた後、直接トラバースして一致しない番号を見つけます
import java.util.Arrays;
import java.util.Scanner;
public class LianXi {
public static int solve1(int []A){
Arrays.sort(A);
int i = 0;
while(i < A.length){
if((i+1) != A[i])
return i+1;
else
i++;
}
return i+1;
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int []A = new int[N];
for(int i = 0; i<N; i++){
A[i] = in.nextInt();
}
System.out.println("初始数组为:");
for(int i = 0; i<N; i++){
System.out.print(A[i] + " ");
}
System.out.println("\n");
int res = solve1(A);
System.out.println("结果为: " + res);
}
}
解決策2:補助アレイを使用する
import java.util.Arrays;
import java.util.Scanner;
public class LianXi {
public static int solve1(int []A){
Arrays.sort(A);
int n = A.length;
int []helper = new int[n+1];
for(int i = 0; i<n; i++){
if(A[i]<n+1)
helper[A[i]] = 1;
}
for(int i = 1; i<=n; i++){
if(helper[i]==0)
return i;
}
return n + 1;
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int []A = new int[N];
for(int i = 0; i<N; i++){
A[i] = in.nextInt();
}
System.out.println("初始数组为:");
for(int i = 0; i<N; i++){
System.out.print(A[i] + " ");
}
System.out.println("\n");
int res = solve1(A);
System.out.println("ID为: " + res);
}
}