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;
}