Introdução aos Algoritmos 2.3 de divisão ideológica e conquistar entender merge sort

merge sort

Merge sort é a coisa mais importante é os dois ordenada merge sub-array, optamos por comparar cada sub-array tem que repetir o tamanho de um pequeno reposicionamento do grupo original. No último valor de sentinela conjunto para cada sub-matriz temporária, definida para um valor especial INT_MAX, para que possa proteger a matriz quando uma criança atinge o valor de sentinela sempre será outra sub-array atribuído à matriz original, a menos que as duas sub-matrizes são para atingir o valor de sentinela . Quando isso acontece, as duas sub-matrizes foram atribuídos à matriz original, a matriz original foi fundida em uma nova matriz de classificação.

#include <stdio.h>
#include <limits.h>
void merge(int*arr,int p,int q,int r){
	int n1=q-p+1;
	int n2=r-q;
	int left[n1+1];
	int right[n2+1];
	for(int i=0;i<n1;i++)
		left[i]=arr[p+i];		//arr[p] 到 arr[q];
	for(int j=1;j<=n2;j++)		
		right[j-1]=arr[q+j];		//arr[q+1]到arr[r];
	left[n1]=INT_MAX;
	right[n2]=INT_MAX;
	int i=0,j=0;
	for(int k=p;k<=r;k++){
		if(left[i]<=right[j]){
			arr[k]=left[i];
			i++;
		}
		else{
			arr[k]=right[j];
			j++;
		}
	}
}

void mergeSort(int* arr,int p,int r){
	int q;
	if(p<r){
		q=(p+r)/2;
		mergeSort(arr,p,q);
		mergeSort(arr,q+1,r);
		merge(arr,p,q,r);
	}
}

int main(void){
	int arr[]={2,4,5,6,1,2,9,0};
	mergeSort(arr,0,7);
	for(int i=0;i<8;i++)
		printf("%d ",arr[i]);
	return 0;
}
Publicado 19 artigos originais · ganhou elogios 1 · vista 3134

Acho que você gosta

Origin blog.csdn.net/qq_41603639/article/details/104729774
Recomendado
Clasificación