Algoritmo 4 (estrutura de dados) aprendizagem - o princípio e o código do algoritmo de classificação primária (classificação por seleção, classificação por inserção, classificação por colina)

1. Classificação de seleção

Uma breve descrição é: primeiro encontre o menor elemento na matriz e troque-o pelo primeiro elemento da matriz; em seguida, encontre o menor elemento entre os elementos restantes e troque a posição com o segundo elemento da matriz; e assim por diante, até o Classifique toda a matriz.
Para uma matriz de comprimento N, leva cerca de (N ^ 2) / 2 comparações e N trocas para selecionar a classificação

2. Classificação de inserção

Classificação por inserção, insira cada elemento na posição apropriada em outras matrizes locais ordenadas, a fim de abrir espaço para o elemento inserido, precisamos mover os elementos restantes na posição apropriada em um lugar;
Simplificando, primeiro determine um valor de índice i, partindo deste i, defina j = i, compare a [j] com a [j-1], se a [j-1]> a [j] trocar os dois , J–, se a [j-1] <a [j], significa que você alcançou a posição correta, saia do pequeno loop, caso contrário, continue a repetir a operação até j = 0; após completar o pequeno loop, coloque o índice i ++.

3. Hill sort

Para simplificar, primeiro altere o intervalo de troca de "classificação por inserção" de 1 para h, e então h = h / 3 depois que a rodada for organizada e, em seguida, repita a operação até h> = 1.

A seguir está o 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);
	}

}

Acho que você gosta

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