기수 정렬 버킷 정렬, 수면 정렬 [데이터 구조]와 사랑에 빠지게

텐 고전적인 정렬 알고리즘!
그림 삽입 설명 여기

머리말

제발확인이것 좀 봐 : 정렬 알고리즘은 + 코드 환경 준비 - 지식 사전 .

위의 내용이 준비가되면, 그것은 일종의 기수 시작!

기수 정렬

기수 정렬 아니라 정수에게 (특히 정렬에 적합 음수가 아닌 정수를 음이 아닌 정수 정렬 기수 만 여기).

실행의 흐름 : 순서에 하나의 숫자, 수십, 수백 자리, 천, 만 자리를 ... 종류 (로우에서 하이로)
그림 삽입 설명 여기

코드 구현

자리, 십의 자리, 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();
		}
		
	}
}
게시 된 170 개 원래 기사 · 원 찬양 47 ·은 20000 +를 볼

추천

출처blog.csdn.net/weixin_43734095/article/details/105170908