간단한 선택 정렬 : (최소 값을 선택하고, 먼저 넣은 다음 첫 번째 비트가 뒤로 이동하고, 루프) 첫 번째 비트는 다음과 같은 후에 각각 비교하고, 가장 작은 비트가 얹을 때마다, 첫 번째 비트는 뒤로 뒤로옵니다. 홍보 (즉, 방금 선택한 첫 번째 숫자는 최소값이며 더 이상 비교에 참여하지 않으며 비교 횟수는 1 씩 줄어 듭니다)
복잡성 : 레코드 이동을 수행하는 데 필요한 작업의 수는 0-3 (N-1)입니다. / 2. 총 시간 복잡성은 O (N2)입니다.
공간 복잡성 O (1)
알고리즘 개선 : 비교할 때마다 가장 작은 값을 처음에 올려 놓고 끝까지 비교하고 최소 값을 찾아서 직접 배치하여 무의미한 스위칭 및 이동 작업을 제거 할 수 있습니다. 또한 방향을 변경하고 마지막 비트를 각각의 이전 비트와 비교하고 매번 최대 값을 바꾸고 마지막 비트를 앞으로 밀어 넣을 수 있습니다.
Java 소스 코드 :
코드 사본은 다음과 같습니다.
public static void selectSort (date [] days) {
int min;
날짜 온도;
for (int i = 0; i <days.length; i ++) {
최소 = i;
for (int j = min+1; j <days.length; j ++) {
if (days [min] .compare (days [j])> 0) {
최소 = J;
}
}
if (min! = i) {
온도 = 일 [i];
날 [i] = 일 [분];
날 [min] = 온도;
}
}
}
클래스 날짜 {
연도, 월, 일;
날짜 (int y, int m, int d) {
년 = y;
달 = m;
day = d;
}
공개 int 비교 (날짜) {
연도> 날짜 : 연도 <날짜?
: Month> Month?
: day. day : day <date.day?
}
public void print () {
System.out.println (Year + "" + Month + "" + Day);
}
}
간단한 선택 정렬 :
간단한 선택 정렬은 버블 분류와 유사합니다 (버블 정렬). 유일한 차이점은 버블 분류가 요소가 현재 값보다 작다는 것을 알 때마다 요소의 위치를 바꾸는 것입니다. 단순한 선택 분류는 나머지 요소에서 가장 값을 가장 많이 선택하고 데이터의 교환 데이터를 선택하는 것입니다. 현재 위치.
예를 들어, 요소 세트의 경우 r = {37, 40, 38, 42, 461, 5, 7, 9, 12}
첫 번째 순서 : 37은 5와 직접 교환되어 새로운 시퀀스 R1 = {5,40,38,42,461,37,7,9,12}를 형성합니다.
두 번째 순서 : 40은 7과 직접 교환하여 새로운 시퀀스 R2 = {5,7,38,461,461,37,40,9,12}를 형성합니다.
그리고 마지막 요소까지 (참고 : 두 번째 순서로 38은 42보다 작지만 데이터를 교환하지는 않습니다).
다음은 정렬을 단순히 선택하는 Java 구현 버전입니다.
코드 사본은 다음과 같습니다.
public static void selectionort (int [] data) {
if (data == null || data.length <= 1)
반품;
int i, j, 값, minpos, len = data.length;
int OUTER = LEN -1, TMP;
for (i = 0; i <외부; i ++) {
값 = 데이터 [i];
minpos = -1;
for (j = i+1; j <len; j ++) {
if (data [j] <value) {
minpos = j;
값 = 데이터 [j];
}
}
if (minpos! = -1) {
tmp = 데이터 [i];
데이터 [i] = 값;
데이터 [minpos] = tmp;
}
// for (int k = 0; k <len; k ++) {
// system.out.print (data [k] + ",");
//}
// system.out.println ();
}
}
public static void main (String [] args) {
int [] coll = {
37, 40, 38, 42, 461, 5, 7, 9, 12
};
selectionsort (coll);
for (int i = 0; i <coll.length; i ++) {
System.out.print (coll [i] + ",");
}
}
나무 선택 정렬
트리 선택 분류 알고리즘은 간단한 선택 분류와 비교하여 시간 동안 공간을 거래하는 일반적인 알고리즘입니다. 아이디어는 N 요소를 분류하고 비교적 작은 (n+1)/2 숫자를 구성한 다음 요소가 하나만있을 때까지 비교적 작은 [n+1]/4 숫자를 구성하는 것입니다. 완전히 바이너리 트리로 구성됩니다.
정렬 할 때 요소가 가장 작은 요소를 꺼내고 요소를 "최대 값"으로 바꾸고 완전한 바이너리 트리를 조정하십시오.
Tree Selection 정렬의 Java 구현 버전은 다음과 같습니다.
코드 사본은 다음과 같습니다.
public static void treeSelectionsort (int [] data) {
if (data == null || data.length <= 1)
반품;
int len = data.length, low = 0, i, j;
// 보조 공간을 추가합니다
int [] tmp = new int [2*len -1];
int tsize = tmp.length;
// 나무를 구성합니다
for (i = len-1, j = tmp.length-1; i> = 0; i-, j-) {
tmp [j] = 데이터 [i];
}
for (i = tsize -1; i> 0; i- = 2) {
TMP [(I-1)/2] = TMP [I]> TMP [I-1] : TMP [I];
}
//끝
// 최소 노드를 제거합니다.
while (low <len) {
데이터 [LOW ++] = TMP [0];
for (j = tsize-1; tmp [j]! = tmp [0]; j-);
tmp [j] = integer.max_value;
while (j> 0) {
if (j%2 == 0) {// 오른쪽 노드 인 경우
TMP [(J-1)/2] = TMP [J]> TMP [J-1]? TMP [J-1] : TMP [J];
J = (J-1)/2;
} else {// 왼쪽 노드 인 경우
TMP [J/2] = TMP [J]> TMP [J+1] : TMP [J];
J = J/2;
}
}
}
}
완전한 이진 트리를 구성 할 때는 N 요소 모음에 2*n -1 보조 공간이 필요합니다.
암호:
코드 사본은 다음과 같습니다.
while (j> 0) {
if (j%2 == 0) {// 오른쪽 노드 인 경우
TMP [(J-1)/2] = TMP [J]> TMP [J-1]? TMP [J-1] : TMP [J];
J = (J-1)/2;
} else {// 왼쪽 노드 인 경우
TMP [J/2] = TMP [J]> TMP [J+1] : TMP [J];
J = J/2;
}
}
그런 다음 새 세트에서 최소 값의 재귀 구조를 구현하십시오.