데이터 구조 및 알고리즘 메모 ------- 선택 정렬

정렬 선택

기본 소개

선택적 정렬 은 지정된 규칙에 따라 정렬 할 데이터에서 요소를 선택한 다음 정렬 목적을 달성하기 위해 규정 에 따라 위치교환 하는 내부 정렬 방법 에도 속합니다 .

생각 정렬

선택 정렬도 간단한 정렬 방법입니다. 기본 아이디어는 다음과 같습니다.

처음 : 배열에서 가장 작은 값을 찾아서 array [0]로 교환합니다. 즉, 버블 링, 스와핑과 같은 가장 작은 값을 찾는 대신 배열을 순회하여 가장 작은 값을 찾고 array [0으로 스와핑하는 것입니다. ], 한 번만 교환

두 번째 : 어레이 어레이의 어레이 [1] ~~~ 어레이 [n-1]에서 최소값을 찾아 어레이 [1]과 교환이 과정에서는 한 번의 교환 만 발생합니다.

세 번째 : array [2]가 최소값이됩니다. . . . 등등

총 n-1 회를 전달하여 정렬 코드에 따라 작은 순서에서 큰 순서로 정렬 된 순서를 얻습니다.

img

아이디어

첫 번째 라운드 : 첫 번째 위치를 가장 작은 숫자로 간주하고 나머지 배열반복 하기 시작 하고 가장 작은 값을 가장 작은 값으로 업데이트 한 다음 현재 값보다 작은 값을 찾습니다. 한 라운드 후에 가장 작은 숫자를 찾고 스와핑 시작

두 번째 라운드 : 두 번째 위치를 가장 작은 숫자로 간주하고 , 나머지 배열반복 하기 시작하고 , 나중에 비교하여 그보다 작은 지 확인하고, 최소값을 업데이트 한 다음, 나머지 숫자 중 가장 작은 숫자를 찾습니다. 순회 후 첫 번째 위치로 교체

3 라운드 : 동일, 3 위부터 시작

….

n-1 라운드까지

질문을 들어주세요 :

기존 섹션 열 대학생, 컬러 값은 [100,10,35,24,16,79,4,2,57,80, 선택 종류를 사용 에 로우에서 하이로 정렬

암호

파생 과정 :

/**
 * @author 王庆华
 * @version 1.0
 * @date 2020/12/21 21:32
 * @Description TODO
 * @pojectname 简单选择排序
 */
public class SelectSort {
    
    
    public static void main(String[] args) {
    
    
        int[] array = {
    
    100,10,35,24,16,79,4,2,57,80};
        selectSort(array);
    }
    //选择排序算法
    public static void selectSort(int[] array){
    
    
        //逐步推到方式
        //第一轮排序
        //原始数组[100,10,35,24,16,79,4,2,57,80]
        //结果:[2,10,35,24,16,79,4,100,57,80]
        int minIndex = 0;//用来存放,最小值的下标
        int min = array[0];//假定现在最小值是数组第一个  也充当了中间值,来交换
        for (int i = 0+1; i < array.length ; i++) {
    
    
            if (min > array[i]){
    
    //说明我们的假定最小值不是最小值
                min = array[i];  //重置最小值
                minIndex = i;   //重置最小值索引
            }
        }
        //循环结束,开始交换
        if (minIndex != 0) {
    
    
            array[minIndex] = array[0];
            array[0] = min;
        }
        System.out.println("第一轮后:"+ Arrays.toString(array));
        //第一轮后:[2, 10, 35, 24, 16, 79, 4, 100, 57, 80]

        //第二轮排序
        minIndex = 1;//用来存放,最小值的下标
        min = array[1];//假定现在最小值是数组第一个  也充当了中间值,来交换
        for (int i = 1+1; i < array.length ; i++) {
    
    
            if (min > array[i]){
    
    //说明我们的假定最小值不是最小值
                min = array[i];  //重置最小值
                minIndex = i;   //重置最小值索引
            }
        }
        //循环结束,开始交换
        if (minIndex != 1) {
    
    
            array[minIndex] = array[1];
            array[1] = min;
        }
        System.out.println("第二轮后:"+ Arrays.toString(array));
        //第二轮后:第二轮后:[2, 4, 35, 24, 16, 79, 10, 100, 57, 80]
        //依次类推
    }
}

파생 과정에서 각 for 루프 이전에 시작 표시가 이전 for 루프의 시작 위치보다 +1이라는 것을 발견했습니다.

그런 다음 for 루프를 사용하여

/**
 * @author 王庆华
 * @version 1.0
 * @date 2020/12/21 21:32
 * @Description TODO
 * @pojectname 简单选择排序
 */
public class SelectSort {
    
    
    public static void main(String[] args) {
    
    
        int[] array = {
    
    100,10,35,24,16,79,4,2,57,80};
        System.out.println("排序前"+Arrays.toString(array));
        selectSort(array);
        System.out.println("排序后"+Arrays.toString(array));
    }
    //选择排序算法
    public static void selectSort(int[] array){
    
    
        for (int i = 0; i < array.length -1 ; i++) {
    
    
            int minIndex = i;
            int min = array[i];
            for (int j = i+1; j <array.length ; j++) {
    
    
                if (min > array[j]){
    
    //说明假定的最小值不是最小
                    min = array[j];//重置min
                    minIndex = j;//重置最小值下标
                }
            }
            //交换
            if (minIndex != i){
    
    
                array[minIndex] = array[i];
                array[i] = min;
            }
            System.out.println("第"+i+"轮排序的结果是");
            System.out.println(Arrays.toString(array));
        }
    }
}

언어로 기억을 깊게합시다 :

외부 루프는 정렬 첫 번째 라운드 를 제어 하고 내부 루프는 정렬이 시작 되는 위치를 제어하는 ​​데 사용 됩니다.

그중 장점은 무엇입니까? 우리는 우리의 데이터 교환 방법이 우리의 버블 정렬과 다르다는 것을 발견했습니다. 이것은 교환이기 때문에 우리의 버블 정렬 과 달리 요구 사항을 충족 할 때마다 교환하므로 우리의 선택 정렬 은 가장 작은 값을 사용합니다. 가치 지수는 사용되는 중간 보조 변수입니다. 한 번만 변경

그래서 어떤 사람들은 제가 N 라운드에서 트레이드 할 필요가 없다면 어떨까요? 우리가 교환 할 때 if 판정의 추가 레이어가 있음을 발견했습니다 . 현재 최소 첨자가 처음에 가정 한 최소값의 첨자 인지 판단하기 위해 판단을 사용하면 교환하지 않으면 출력됩니다 직접., 교환이 발생하지 않습니다. 이는 작은 최적화입니다.

그런 다음 정렬을 선택하여 배열 [80000] 배열을 정렬하는 데 걸리는 시간을 측정했습니다. 2 초 또는 3 초 밖에 안되며 실제로 버블 정렬보다 훨씬 빠릅니다.

추천

출처blog.csdn.net/qq_22155255/article/details/111501683