#Sort ordenação por inserção direta por algoritmo e ordenação Hill
Hoje, apresentamos a ordenação por inserção direta e o método de ordenação otimizado.
Classificação de inserção direta
A classificação por inserção direta é um dos métodos de classificação mais básicos em que as pessoas podem pensar.Este método de classificação divide a sequência a ser classificada em duas partes, uma parte é classificada e a outra parte não é classificada. No início, a parte classificada contém apenas um elemento e, portanto, é ordenada naturalmente.A cada vez, um elemento da outra parte, ou seja, a sequência a ser classificada, é comparado com a sequência já ordenada em sequência: os elementos que são maiores do que sequencialmente Mova uma posição para a direita até encontrar o elemento menor ou menor na peça classificada, que determina a posição correta do elemento a ser classificado.
O diagrama de demonstração dinâmica é o seguinte: o
código é implementado da seguinte maneira:
public class InsertSort {
public static void main(String[] args) {
Integer[] arr = {8, 6, 1, 3, 9, 7, 2, 5, 4};
// 外层循环:每次将无序部分第一个元素插入到前面有序部分中正确位置
for (int i = 1; i < arr.length; i++) {
int j = i - 1;
int tmp = arr[i];
// 内层循环:将外层元素依次与已排序列元素比较
while (j >= 0 && arr[j] > tmp) {
// 保证已排序部分有序性,较大元素右移
arr[j + 1] = arr[j];
j--;
}
// 找到排序位置后插入
arr[j+1] = tmp;
}
// test-打印
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
A complexidade do tempo ideal é O (n), ou seja, uma sequência já ordenada, apenas cada elemento precisa ser comparado uma vez e a média e o pior caso são O (n ^ 2).
Classificação do shell
A ordenação em colina é baseada na ordenação por inserção direta, que promove as vantagens da ordenação por inserção direta no caso de pequenas seqüências e ordenação básica, e usa a idéia de dividir e conquistar para agrupar as seqüências originais e, em seguida, classificar os elementos no grupo separadamente. Em seguida, reduza o número de grupos e aumente o número de elementos no grupo até que o grupo seja mesclado em um.
O diagrama de demonstração dinâmico é o seguinte: o
código é implementado da seguinte forma (o diagrama de demonstração não corresponde ao código):
/**
* @description: 希尔排序基本实现
* @author: liyaguang
* @create: 2018-08-31 13:41
**/
public class ShellSort {
public static void main(String[] args) {
Integer[] arr = {8, 6, 1, 3, 9, 7, 2, 5, 4};
// 确定分组个数,即确定了每个子序列,也是子序列步长
for (int i = arr.length / 2; i > 0; i /= 2) {
// 循环每个子序列,进行排序
for (int j = 0; j < i; j++) {
// j、j+i、j+i+i、……、n-i
// 调用插入排序方法,传入子序列值
modInsertSort(arr, j, i);
}
}
// 若增量序列中不能保证最后的间距为1,则执行一次扫尾工作,此方法内不需要
// modInsert(arr, 0, 1);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
/**
* @param arr 待排数组
* @param startPos 待排子序列起始位置
* @param delta 步长/分组个数
*/
public static void modInsertSort(Integer[] arr, int startPos, int delta) {
for (int i = startPos + delta; i < arr.length - startPos; i += delta) {
for (int j = i; j > startPos; j -= delta) {
if (arr[j] < arr[j - delta]) {
// swap(arr, y, y -= i);
int tmp = arr[j - delta];
arr[j - delta] = arr[j];
arr[j] = tmp;
} else {
break;
}
}
}
}
}
A complexidade de tempo da classificação de Hill está intimamente relacionada à estratégia de agrupamento selecionada. Da maneira acima, o "número de agrupamentos dividido por 2 diminuições" é, na verdade, a complexidade de tempo ainda O (n ^ 2). A seleção da sequência incremental apropriada Melhore efetivamente a eficiência da classificação de Hill, alguns podem atingir O (n ^ 3/2), O (n ^ 5/4), e alguns podem até alcançar O (n ^ 7/6), muito perto de O (nlogn )
Sumário
A classificação por inserção direta é uma das maneiras mais prováveis de classificar nossas vidas.Por exemplo, para classificar os resultados de uma classe, usamos um papel em branco o suficiente para registrar primeiro o primeiro aluno na lista de espera. Para os resultados, compare os resultados do segundo aluno com o primeiro para encontrar uma posição adequada e, em seguida, compare os terceiros dados a serem classificados com os dois primeiros para obter o efeito de classificação final.
O uso da ordenação por inserção direta é muito intuitivo e eficaz quando a quantidade de dados na vida é pequena e a sequência a ser ordenada é basicamente ordenada.A complexidade do tempo pode ser controlada em O (n), enquanto a ordenação Hill é baseada na ordenação por inserção direta No jogo completo de suas vantagens, o uso de agrupar, dividir e conquistar o caminho para se tornar cada vez menor, e então gradualmente tirar proveito dos resultados ordenados básicos no processo de fusão.
Referência:
"Estrutura e algoritmo de dados"
Inserção sort-Wikiwand
Shellsort-wikiwand
Bem-vindo a prestar atenção à minha conta pública para saber mais: