Aprendizaje del algoritmo 4 (estructura de datos): el principio y el código del algoritmo de clasificación principal (clasificación por selección, clasificación por inserción, clasificación por colinas)

1. Orden de selección

Una breve descripción es: primero busque el elemento más pequeño en la matriz e intercambielo con el primer elemento de la matriz; luego encuentre el elemento más pequeño entre los elementos restantes e intercambie la posición con el segundo elemento de la matriz; y así sucesivamente, hasta que Ordene toda la matriz.
Para una matriz de longitud N, se necesitan aproximadamente (N ^ 2) / 2 comparaciones y N intercambios para seleccionar ordenar

2. Orden de inserción

Orden de inserción, inserte cada elemento en la posición apropiada en otras matrices locales ordenadas, para dejar espacio para el elemento insertado, necesitamos mover los elementos restantes en la posición apropiada en un lugar;
En pocas palabras, primero determine un valor de índice i, a partir de este i, defina j = i, compare a [j] con a [j-1], si a [j-1]> a [j] intercambie los dos , J–, si a [j-1] <a [j], significa que ha alcanzado la posición correcta, salga del bucle pequeño, de lo contrario continúe repitiendo la operación hasta j = 0, después de completar el bucle pequeño, ponga el índice i ++.

3. Tipo de colina

En pocas palabras, primero cambie el intervalo de intercambio de "ordenación por inserción" de 1 a h, y luego h = h / 3 después de que se organice la ronda, y luego repita la operación hasta que h> = 1.

El siguiente es el código

import java.util.*;

public class Example {
    
    

	//选择排序
	public static void SelectSort(Comparable[] a) {
    
    
		for (int i = 0; i < a.length; i++) {
    
    
			int min = i;
			for (int j = i+1; j < a.length; j++) {
    
    
				if (less(a[j], a[min])) {
    
    
					min = j;
				}
			}
			exch(a, i, min);
		}
	}
	
	/*插入排序,简单来说就是先确定一个索引值i,从这个i开始,定义j=i,a[j]与a[j-1]比较,若a[j-1]>a[j]则交换二者,j--,
	     若a[j-1]<a[j]则表明已经到了正确的位置,退出小循环,否则继续重复操作,直到j=0;完成小循环后把索引i++*/
	public static void InsertSort(Comparable[] a) {
    
    
		for (int i = 1; i < a.length; i++) {
    
    
			for (int j = i; j > 0 && less(a[j], a[j-1]); j--) {
    
    
				exch(a, j, j-1);
			}
		}
	}
	
	//希尔排序
	public static void ShellSort(Comparable[] a) {
    
    
		int h = 1;
		while (h < a.length/3) {
    
    
			h = 3*h + 1;
		}
		while (h >= 1) {
    
    
			for (int i = h; i < a.length; i++) {
    
    
				for (int j = i; j >= h && less(a[j], a[j-h]); j-=h) {
    
    
					exch(a, j, j-h);
				}
			}
			h = h / 3;
		}
	}
	
	//做比较判断,返回bool类型
	public static boolean less(Comparable v, Comparable w) {
    
    
		return v.compareTo(w) < 0;
	}
	
	//交换数组元素
	private static void exch(Comparable[] a, int i, int j) {
    
    
		Comparable t = a[i];
		a[i] = a[j];
		a[j] = t;
	}
	
	//打印出数组
	public static void show(Comparable[] a) {
    
    
		for (int i = 0; i < a.length; i++) {
    
    
			System.out.print(a[i]+" ");
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
    
    
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		Comparable[] arr = new Comparable[n];
		for (int i = 0; i < arr.length; i++) {
    
    
			arr[i] = in.nextInt();
		}
		SelectSort(arr);
		InsertSort(arr);
		ShellSort(arr);
		show(arr);
	}

}

Supongo que te gusta

Origin blog.csdn.net/UCB001/article/details/105010877
Recomendado
Clasificación