Algoritmo de divisão e conquista para alcançar a implementação clássica de java de classificação de mesclagem

contente

 

1. Qual é o algoritmo de divisão e conquista

dividir e conquistar

ideia básica

2. A incorporação do algoritmo de divisão e conquista: ordenação por mesclagem

classificação de mesclagem

ideia básica

3. Implementação do código


1. Qual é o algoritmo de divisão e conquista

dividir e conquistar

Dividir e conquistar, literalmente "dividir e conquistar", é dividir um problema complexo 1 em dois ou mais subproblemas idênticos ou semelhantes, e então dividir os subproblemas em subproblemas menores até que o subproblema final possa ser simplesmente resolvido diretamente, a solução do problema original é a combinação das soluções dos subproblemas. Essa ideia é a base de muitos algoritmos eficientes, como algoritmos de ordenação (classificação rápida, ordenação por mesclagem), transformada de Fourier (transformada rápida de Fourier) e assim por diante.

ideia básica

A ideia básica do método de dividir e conquistar é dividir um grande problema que é difícil de resolver diretamente em alguns problemas menores da mesma escala, para que cada um possa ser quebrado e dividido e conquistado.

2. A incorporação do algoritmo de divisão e conquista: ordenação por mesclagem

classificação de mesclagem

Merge sort ( MERGE - SORT ) é um método de ordenação implementado pela ideia de fusão. . , e a fase de conquista "remenda" as respostas obtidas na fase de divisão, ou seja, dividir e conquistar).

ideia básica

Fluxograma (tome a classificação da matriz [8,4,5,7,1,3,6,2] como exemplo)

marca d'água,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGC5LiN6ISx5Y-R,size_20,color_FFFFFF,t_70,g_se,x_16

Vamos olhar para o estágio de governança novamente, precisamos mesclar as duas subsequências já ordenadas em uma sequência ordenada, como a última mesclagem na figura acima, para
[4,5,7,8] e [1,2, 3, 6] Duas subsequências já ordenadas são mescladas na sequência final [1,2,3,4,5,6,7,8], vamos ver os passos de implementação.

marca d'água,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rGC5LiN6ISx5Y-R,size_20,color_FFFFFF,t_70,g_se,x_16

 3. Implementação do código

package Sort;

import java.util.Arrays;
/**
 * 归并排序:
 * 
 * 利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,
 * 
 * 而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
 * @author lenovo
 *
 */
public class MergeSort {
	public static void main(String[] args) {
		int[] a= {5,8,6,3,9,8,7,1,4,21,-8,46};
		int[] temp=new int[a.length];
		mergeSort(a, 0, a.length-1, temp);
		System.out.println(Arrays.toString(a));
	}
	public static void mergeSort(int[] arr,int left,int right,int[] temp) {
		if(left<right) {
			int mid=(left+right)/2;
			mergeSort(arr, left, mid, temp);
			mergeSort(arr, mid+1,right, temp);
			merge(arr, left, mid, right, temp);
		}
	}
	public static void merge(int[] arr,int left,int mid,int right,int[] temp) {
		int l=left;//左边序列的起始位置
		int r=mid+1;//右边序列的起始位置
		int t=0;//中间数组的当前元素下标
		while(l<=mid &&r<=right ) {//左边或右边没结束
			//那边小就将那边的元素放入到临时数组中
			if(arr[l]<=arr[r]) {
				temp[t++]=arr[l++];
			}else {
				temp[t++]=arr[r++];
			}
		}
		//while循环结束,说明有一边已经遍历完毕,将另一边剩余的元素放入到临时数组中
		while(l<=mid) {
			temp[t++]=arr[l++];
		}
		while(r<=right) {
			temp[t++]=arr[r++];
		}
		//将临时数组中的有序序列copy到原数组中
		t=0;
		int templeft=left;
		while(templeft<=right) {
			arr[templeft++]=temp[t++];
		}
	}
}

Acho que você gosta

Origin blog.csdn.net/qq_52360069/article/details/123580334
Recomendado
Clasificación