87.検索と並べ替えの演習の概要(2)

検索と並べ替えの演習の概要(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);
	} 
}

おすすめ

転載: blog.csdn.net/JiangYu200015/article/details/113610002