归并排序
思想:若针对两个有序的数组,要将其合并为一个有序的数组时,采用归并排序。若对于无序的两个数组,采用分治的策略,递归排序
#include<stdio.h>
int arr[30] = {98,4,6,12,32,34,65,67,23,222,333,444,531,123,111,221,334,246,765,2,9,14,15,36,64,74,42,45,109,47};
int num = 0;
void merge(int arr[],int L,int M,int R){
int LEFT_SIZE = M-L;
int RIGHT_SIZE = R-M+1;
int leftArr[LEFT_SIZE];
int rightArr[RIGHT_SIZE];
int i; int j; int k;
//1.init new arr
for(i=L;i<M;i++){
leftArr[i-L] = arr[i];
}
for(i=M;i<=R;i++){
rightArr[i-M] = arr[i];
}
i=0;j=0;k=L;
// 2.first sort
while(i<LEFT_SIZE && j<RIGHT_SIZE){
if(leftArr[i] < rightArr[j]){
arr[k] = leftArr[i];
i++;
k++;
}
else
{
arr[k] = rightArr[j];
j++;
k++;
}
}
//3.end sort
while(i < LEFT_SIZE){
arr[k] = leftArr[i];
i++;
k++;
num++;
}
while( j<RIGHT_SIZE ){
arr[k] = rightArr[j];
j++;
k++;
}
}
void mergeSort(int arr[],int L,int R){
if( L==R ){
return;
}
else{
int M=(L+R)/2;
mergeSort(arr,L,M);
mergeSort(arr,M+1,R);
merge(arr,L,M+1,R);
}
}
int main(void){
int i = 0;
int L,R;
L=0;
R=29;
mergeSort(arr,L,R);
for(i=0;i<29;i++){
printf("%d ",arr[i]);
}
}