1. Conceitos básicos
1. Conceito:
- A classificação é a operação de organizar uma sequência de registros em ordem crescente ou decrescente de acordo com o tamanho de uma ou algumas palavras-chave. No contexto normal, se você mencionar a classificação, geralmente se refere à ordem crescente (não decrescente)
2. Estabilidade
- Se dois dados iguais forem classificados, o algoritmo de classificação pode garantir que sua posição relativa não mude, então chamamos o algoritmo de algoritmo de classificação estável
. - Vamos usar um diagrama simples para explicar a todos: os dados fornecidos na figura têm dois 3. Se após a classificação, o 3 preto ainda estiver após o 3 vermelho, então essa classificação é estável, caso contrário, é instável.
3.Java comum
2. Implementação de código de classificação específico
1. Classificação por inserção direta
-
Estabilidade (estável): A classificação estável não trocará saltos de dados durante o processo de classificação
. 1. Uma classificação estável pode se tornar uma classificação instável;
2. Uma classificação instável por si só não pode se tornar estável; -
Complexidade do espaço: O (1);
-
complexidade de tempo:
- Melhor caso: quando o array O (n) é ordenado;
- Pior caso: o pior caso O (n2) quando o array está fora de ordem;
-
Idéia : pegue a ordem crescente como exemplo
1. Primeiro use i para percorrer a matriz desde o início;
2. Em seguida, pegue um espaço tmp fora e coloque arr [i] em cada vez;
3. Em seguida, defina uma variável j, o valor inicial de j i-1;
4. Compare o tamanho de arr [j] e tmp, se for maior que tmp, coloque arr [j] na posição j + 1;
5. Ele será organizado até que i atravesse a matriz.
public static void insertsort(int[] arr){
for(int i = 1;i < arr.length;i++) {
int tmp = arr[i];
int j = i-1;
for (;j >= 0;j--){
if (arr[j] > tmp) {
arr[j+1] = arr[j];
}else{
break;
}
}
arr[j+1] = tmp;
}
}
2. Hill sort
- Estabilidade (instável)
1. Uma espécie estável pode se tornar uma espécie instável;
2. Um inerentemente instável não pode se tornar estável;
-
Complexidade do espaço: O (n ^ 1,3) -O (n ^ 1,5);
-
complexidade de tempo:
- Melhor caso: quando o array O (n) é ordenado;
- Pior caso: o pior caso O (n ^ 2) quando o array está fora de ordem;
-
Ideia : ordem crescente como exemplo
1. A classificação por colina é, na verdade, uma otimização da classificação por inserção direta;
2. O agrupamento de um grupo de dados, como a figura a seguir é dividido em 5 grupos, lacuna == 5, começando da posição 0, adicione lacuna, para determinar os elementos em um grupo, a mesma cor abaixo é um grupo;
3. Em seguida, cada grupo é classificado por classificação por inserção direta;
4. Desta vez, a linha é concluída, na próxima vez ela é dividida em 3 grupos , em Chamada de classificação por inserção direta, da próxima vez você pode dividi-lo em 2 grupos ou diretamente em um grupo;
5. Continue agrupando até que seja dividido em um grupo e classifique a ordem, então a classificação será feita;
6. Em seguida, todos definitivamente quer saber como escolher gap Você descobriu que o número de grupos é primo, então o número de grupos é selecionado de acordo com o tamanho dos dados. Por exemplo, o seguinte grupo de dados tem 15 elementos, que são divididos em 5, 3 e 1 grupos.
//希尔排序(优化直接插入排序)
public static void shellsort(int[] arr){
//1.首先获取组数gqp
int[] drr = {
5,3,1};//定义一个增量数组
for (int i = 0;i < drr.length;i++){
shell(arr,drr[i]);
}
}
//直接插入排序
public static void shell(int[] arr,int gap) {
for(int i = gap;i < arr.length;i++) {
int tmp = arr[i];
int j = i-gap;
for (;j >= 0;j -= gap){
if (arr[j] > tmp) {
arr[j+gap] = arr[j];
}else{
break;
}
}
arr[j+gap] = tmp;
}
}
3. Teste de resultado
public class TestSort {
//直接插入排序
public static void insertsort(int[] arr){
for(int i = 1;i < arr.length;i++) {
int tmp = arr[i];
int j = i-1;
for (;j >= 0;j--){
if (arr[j] > tmp) {
arr[j+1] = arr[j];
}else{
break;
}
}
arr[j+1] = tmp;
}
}
//希尔排序(优化直接插入排序)将数组进行分组
public static void shellsort(int[] arr){
//1.首先获取组数gqp
int[] drr = {
5,3,1};//定义一个增量数组
for (int i = 0;i < drr.length;i++){
shell(arr,drr[i]);
}
}
//直接插入排序
public static void shell(int[] arr,int gap) {
for(int i = gap;i < arr.length;i++) {
int tmp = arr[i];
int j = i-gap;
for (;j >= 0;j -= gap){
if (arr[j] > tmp) {
arr[j+gap] = arr[j];
}else{
break;
}
}
arr[j+gap] = tmp;
}
}
//测试main方法
public static void main(String[] args) {
//直接插入排序
int[] arr = {
2,3,5,1,6,4};
insertsort(arr);
System.out.print("直接插入排序结果: ");
for (int i = 0;i < arr.length;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
//希尔排序
int[] arr1 = {
7,4,9,34,0,8,5,22,55,6,12,33,56,89,77};
shellsort(arr1);
System.out.print("希尔排序结果: ");
for (int i = 0;i < arr1.length;i++){
System.out.print(arr1[i]+" ");
}
System.out.println();
}
}