삼분는 선택 정렬 자바 버전을 이해하는

개념

선택 정렬 (selectsorting)도 선별하는 간단한 방법이다. 기본적인 아이디어는 첫째, 최소 정렬되지 않은 순서를 찾을 수 있습니다 (대형) 요소는 다음 시작 위치에 저장하고, 분류 순서가 남아있는 분류되지 않은 요소에서 가장 작은 (큰) 요소를 찾기 위해 계속 넣어 그것을 분류 시퀀스의 끝. 등등, 모든 요소 정렬 될 때까지.

상세 사항 :이 예는 시작 위치에 최소 값을 찾는 것입니다.

[0], 언 ~ [N-1] 제 최소값으로부터 선택된 도착하고 도착 [0] 교환, 제 [N-1]는 선택된 최소값으로부터 도착 [1] ~ 도착 및 도착의 [ 1] 과거, [2] ~, 언 [N-1 도착에서는 [2] 과거, ..., I가 도착에서 토륨 도착으로부터 선택된 제 최소값 [I-1] ~, 언 [N-1] 최소값 선택 도착 [I-1] 과거, ..., 제 n-1 번 [N-2] ~, 언 [N-1] 도착 [N-2] 교환 개의 도착 최소으로부터 선택된 n은 1 배 큰 순서로 배열에서 작은 정렬 된 코드 시퀀스를 얻었다.

도표

우리는 전체 배열 크기를 취할 -1 시간이 필요합니다.

단계별

설명 : 시작 소자의 소자보다 작은, 그리고 분 위치에는 minIndex 값이 기록되면, 배열을 나머지 루프를 각각의 스위칭 소자가 가장 작은 것으로 가정되기 전에 시작하고. 값이 전환의 발생을 나타내는 시작 위치가 아닌 경우에는 minIndex 사이클이 종료되면, 우리는 개시 위치에는 minIndex 소자, 상기 시작 위치에 분 최소값을 넣어.

    //使用逐步推导的方式
    //第1轮
    //原始的数组 :  101, 34, 119, 1
    //第一轮排序 :      1, 34, 119, 101

    //第1轮
    int minIndex = 0; //
    int min = arr[0]; // 假设arr[0]就是最小的元素,
    // 从数组的第二个元素开始起找比arr[0]小的元素。找到的话
    for (int j = 0 + 1; j < arr.length; j++) {
        if (min > arr[j]) { //说明假定的最小值,并不是最小
            min = arr[j]; // min记录最小值
            minIndex = j; //minIndex记录此时最小值出现的位置
        }
    }


    //只要上面的交换完成后,发现最小值在后面出现,即minIndex不是0时,将最小值,放在arr[0], 即交换
    if (minIndex != 0) {
        arr[minIndex] = arr[0]; // 把arr[0]放到minIndex的那个位置
        arr[0] = min; // arr[0]放最小值
    }

    System.out.println("第1轮后~~");
    System.out.println(Arrays.toString(arr));// 1, 34, 119, 101


    //第2轮
    minIndex = 1;
    min = arr[1]; // 假设arr[1]是最小的
    for (int j = 1 + 1; j < arr.length; j++) {
        if (min > arr[j]) { // 说明假定的最小值,并不是最小
            min = arr[j]; // 重置min
            minIndex = j; // 重置minIndex
        }
    }

    // 将最小值,放在arr[0], 即交换
    if (minIndex != 1) {
        arr[minIndex] = arr[1];
        arr[1] = min;
    }

    System.out.println("第2轮后~~");
    System.out.println(Arrays.toString(arr));// 1, 34, 119, 101

    // 第三轮
    minIndex = 2;
    min = arr[2]; //假设最小值是

    for (int j = 2 + 1; j < arr.length; j++) {
        if(min > arr[j]){ // 说明假定的最小值,并不是最小
            min = arr[j]; // 记录最小值
            minIndex = j;
        }
    }

    if(minIndex != 2){
        arr[minIndex] = arr[2];
        arr[2] = min;
    }
    System.out.println("第3轮后~~");
    System.out.println(Arrays.toString(arr));// 1, 34, 101, 119

코드 구현

//选择排序
public static void selectSort(int[] arr) {

    //在推导的过程,我们发现了规律,因此,可以使用for来解决
    //选择排序时间复杂度是 O(n^2)
    for (int i = 0; i < arr.length - 1; i++) {
        int minIndex = i;
        int min = arr[i];
        for (int j = i + 1; j < arr.length; j++) {
            if (min > arr[j]) { // 说明假定的最小值,并不是最小
                min = arr[j]; // 记录最小值
                minIndex = j; // 记录最小值出现位置
            }
        }

        // 将最小值,放在arr[i], 即交换
        if (minIndex != i) {
            arr[minIndex] = arr[i];
            arr[i] = min;
        }
    }

테스트 케이스

public static void testArray() {
    int[] arr = new int[80000];
    for (int i = 0; i < 80000; i++) {
        arr[i] = (int) (Math.random() * 8000000); //生成一个[0, 8000000) 数
    }

    Date data1 = new Date();
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String date1Str = simpleDateFormat.format(data1);
    System.out.println("排序前的时间是=" + date1Str);

    //测试冒泡排序
    selectSort(arr);
    Date data2 = new Date();
    String date2Str = simpleDateFormat.format(data2);
    System.out.println("排序后的时间是=" + date2Str);

}

수출

시간을 정렬하기 전에 = 2019년 8월 31일 22시 18분 19초는
정렬이 후 시간 = 2019년 8월 31일 22시 18분 22초

추천

출처www.cnblogs.com/benjieqiang/p/11440762.html