题目:

解一:核心思路(选择排序):每一轮从待排序元素中找到“最值”(最大或最小,该题中为升序排序,所有为最小),将其放到当前轮的“目标位置”,重复此过程直到所有元素有序。

具体操作:1、分区域:把数组分成 “已排序区” 和 “未排序区”(初始时已排序区为空,未排序区是整个数组)。2、找最值:在未排序区中找到最小元素,记录它的下标。3、交换位置:将这个最小元素和 “未排序区的第一个元素” 交换位置,此时该元素被纳入已排序区。4、缩小范围:未排序区的范围缩小(排除已放入已排序区的元素),重复步骤 2~3,直到未排序区只剩 1 个元素(自动有序)。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n=scan.nextInt();
        int arr[]=new int[n];
        for(int i=0;i<arr.length;i++)
        {
            arr[i]=scan.nextInt();
        }
        scan.close();

        for(int i=0;i<arr.length-1;i++)
        {
            int min=arr[i];
            int minIndex=i;
            for(int j=i+1;j<arr.length;j++)
            {
                if(min>arr[j])
                {
                    min=arr[j];
                    minIndex=j;
                }
            }
            if(minIndex!=i)
            {
                arr[minIndex]=arr[i];
                arr[i]=min;
            }
        }
        for(int i=0;i<arr.length;i++)
        {
          System.out.print(arr[i]+" ");
        }
    }
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int x[] = new int[n];
        for (int i =0;i<x.length;i++){
            x[i] = scanner.nextInt();
        }
        for (int i = 0;i<x.length;i++){
            for (int j = i;j<x.length;j++){
                if (x[i]>x[j]){
                    int temp = x[i];
                    x[i] = x[j];
                    x[j] = temp;
                }
            }
        }
        for (int i = 0;i<n;i++){
            System.out.print(x[i]+" ");
        }
        scan.close();
    }
}

解二:调用Arrays.sort()方法。获取目标数组,调用该方法排序进行输出。

import java.util.Scanner;

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int num=scan.nextInt();
        int[] arr=new int[num];
        for(int i=0;i<num;i++){
            arr[i]=scan.nextInt();
        }
        Arrays.sort(arr);
        for(int i:arr){
          System.out.printf("%d ",i);
        }
        scan.close();
    }
}

解三:该解法使用了快速排序的思想。快速排序的基本思路是在待排序的n个元素(无序区)中任取一个元素(通常取首元素)作为基准(该解法中基准为p),把该元素放入最终位置后(称为基准归为),整个数据序列被基准分割成两个序列(“(arr,left,p-1)”和“(arr,p+1,right)”),所有不大于基准的元素放置在前面子序列(无序区1)中,所有不小于基准的元素放置在后面子序列(无序区2)中,并把基准排在这两个子序列的中间,这个过程称作划分(具体步骤为partition方法里的代码)。然后对两个子序列分别重复上述过程,直到每个子序列内只有一个元素或子序列为空为止(判断对应的是quicksort方法里if判断语句right>left,只有一个元素或子序列为空则为right<=left,届时返回该已排序完成的数组)。

这是一种二分法思想,每次将整个无序区一分为二,归位一个元素,对两个子序列采用同样的方式进行排序,直到子序列长度为1或0为止。

import java.util.Scanner;

public class Made {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int[] arr = new int[n];
        for(int i=0;i<n;i++){
            arr[i] = scan.nextInt();
        }
        quicksort(arr,0,n-1);
        for(int i=0;i<n;i++){
            System.out.print(arr[i] + " ");
        }
        scan.close();
    }
    public static int[] quicksort(int[] arr,int left,int right){
        if(right>left){
            int p = partition(arr,left,right);
            quicksort(arr,left,p-1);
            quicksort(arr,p+1,right);
        }
        return arr;
    }
    public static int partition(int[] arr,int left,int right){
        int pviot = arr[right];//确定基准数
        int pviots = right;//基准数的下标
        while(right>left)
        {
            while(right>left&&arr[left]<=pviot) left++;//循环跳出时要么就是left>=right或者找到一个大于基准数的值pviot
            while(right>left&&arr[right]>=pviot) right--;//循环跳出时要么就是left>=right或者找到一个小于基准数的值pviot
            if(right>left) swap(arr,left,right);//俩个循环结束出现arr[left]>=pviot>=arr[right]的情况,这个时候交换arr[left]和arr[right]以实现arr[left]<=pviot<=arr[right]
            else swap(arr,left,pviots);//这个时候是left>=right的情况,这个时候arr[left]>=pviot恒成立,因为left>=right说明它们已经相遇过了,在他们相遇的地方就是新pviot产生的地方,所以这个时候arr[left]>=pviot恒成立,这个时候只需要将pviot和arr[left]进行交换即可
        }
        return left;
    }
    public static void swap(int[] arr,int l,int r){
        int t = arr[l];
        arr[l] = arr[r];
        arr[r] = t;
    }
}

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐