정렬 선택
기본 소개
선택적 정렬 은 지정된 규칙에 따라 정렬 할 데이터에서 요소를 선택한 다음 정렬 목적을 달성하기 위해 규정 에 따라 위치 를 교환 하는 내부 정렬 방법 에도 속합니다 .
생각 정렬
선택 정렬도 간단한 정렬 방법입니다. 기본 아이디어는 다음과 같습니다.
처음 : 배열에서 가장 작은 값을 찾아서 array [0]로 교환합니다. 즉, 버블 링, 스와핑과 같은 가장 작은 값을 찾는 대신 배열을 순회하여 가장 작은 값을 찾고 array [0으로 스와핑하는 것입니다. ], 한 번만 교환
두 번째 : 어레이 어레이의 어레이 [1] ~~~ 어레이 [n-1]에서 최소값을 찾아 어레이 [1]과 교환이 과정에서는 한 번의 교환 만 발생합니다.
세 번째 : array [2]가 최소값이됩니다. . . . 등등
총 n-1 회를 전달하여 정렬 코드에 따라 작은 순서에서 큰 순서로 정렬 된 순서를 얻습니다.
아이디어
첫 번째 라운드 : 첫 번째 위치를 가장 작은 숫자로 간주하고 나머지 배열 을 반복 하기 시작 하고 가장 작은 값을 가장 작은 값으로 업데이트 한 다음 현재 값보다 작은 값을 찾습니다. 한 라운드 후에 가장 작은 숫자를 찾고 스와핑 시작
두 번째 라운드 : 두 번째 위치를 가장 작은 숫자로 간주하고 , 나머지 배열 을 반복 하기 시작하고 , 나중에 비교하여 그보다 작은 지 확인하고, 최소값을 업데이트 한 다음, 나머지 숫자 중 가장 작은 숫자를 찾습니다. 순회 후 첫 번째 위치로 교체
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 초 밖에 안되며 실제로 버블 정렬보다 훨씬 빠릅니다.