텐 고전적인 정렬 알고리즘!
머리말
제발확인이것 좀 봐 : 정렬 알고리즘은 + 코드 환경 준비 - 지식 사전 .
위의 내용이 준비가되면, 그것은 일종의 기수 시작!
기수 정렬
기수 정렬 아니라 정수에게 (특히 정렬에 적합 음수가 아닌 정수를 음이 아닌 정수 정렬 기수 만 여기).
실행의 흐름 : 순서에 하나의 숫자, 수십, 수백 자리, 천, 만 자리를 ... 종류 (로우에서 하이로)
코드 구현
자리, 십의 자리, 0 ~ 9가 해결 된 범위에서 수백 숫자는, 수 정렬 계산 으로 정렬 할 수 있습니다.
package com.mj.sort;
public class RadixSort extends Sort<Integer> {
@Override
protected void sort() {
// 找出最大值
int max = array[0];
for (int i = 1; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
}
}
// 个位数: array[i] / 1 % 10 = 3
// 十位数:array[i] / 10 % 10 = 9
// 百位数:array[i] / 100 % 10 = 5
// 千位数:array[i] / 1000 % 10 = ...
for (int divider = 1; divider <= max; divider *= 10) {
countingSort(divider);
}
}
protected void countingSort(int divider) {
// 开辟内存空间,存储次数
int[] counts = new int[10];
// 统计每个整数出现的次数
for (int i = 0; i < array.length; i++) {
counts[array[i] / divider % 10]++;
}
// 累加次数
for (int i = 1; i < counts.length; i++) {
counts[i] += counts[i - 1];
}
// 从后往前遍历元素,将它放到有序数组中的合适位置
int[] newArray = new int[array.length];
for (int i = array.length - 1; i >= 0; i--) {
newArray[--counts[array[i] / divider % 10]] = array[i];
}
// 将有序数组赋值到array
for (int i = 0; i < newArray.length; i++) {
array[i] = newArray[i];
}
}
}
복잡성과 안정성
- 바람직하게는, 최악의 평균 시간 복잡도 : O (d *를 (N + K)), (D)는 최대 비트 수가되고, k는 16 진수
- 공간 복잡도 : O (N + k)는, k는 16 진수
- 분류에 속하는 기수 안정적 종류
기수 정렬 - 다른 생각
코드 구현
복잡성과 안정성
- 공간 복잡도는 O (KN + K)이고, 시간 복잡도는 O (DN)는
- D는 비트의 최대 수이고, k는 16 진수이다
버킷 정렬
구현 과정 :
- (배럴 등의 배열로하여, 연결리스트) 배럴의 특정 번호를 작성 ①
- ② 특정 규칙 (서로 다른 유형의 데이터를 다른 규칙)에 따라, 일련의 요소는 상기 터브의 균일 한 분포에 대응
- ③ 각 버킷에 대해 개별적으로 분류했다
- ④ 비어 있지 않은 모든 버킷 요소는 정렬 된 순서로 결합된다
버킷의 요소 인덱스 : 요소의 요소 값의 개수 *
실현
복잡성과 안정성
- 공간 복잡도 : O는 (N + m), m은 버킷의 개수
- 시간 복잡도는 :
- N * logm 따라서 (N + K), K는 N * logn이다 O이고 - 버킷은 정렬에 속하는 안정적으로 정렬
"정렬 최강의"- 잠 정렬
/**
* 休眠排序
*/
public class SortThread extends Thread{
public int value;
public SortThread(int value) {
this.value = value;
}
public void run(){
try{
Thread.sleep(value);
System.out.println(value);
}catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
int [] array = {10, 100, 50, 30, 60, 61, 64, 47,79, 59};
for (int i = 0; i < array.length; i++) {
new SortThread(array[i]).start();
}
}
}