归并排序递归实现
#include <stdio.h>
#include <stdlib.h>//导入malloc所需头文件
void mergesort(int num[],int len);
void merging(int *list1,int list1_size,int *list2,int list2_size,int len);
int main(){
int num[10] = {5,2,6,0,3,9,1,7,4,8};//待排序数组
mergesort(num,10);
for(int i = 0; i<10 ;i++){
printf("%d ",num[i]);
}
}
void mergesort(int num[],int len){
//对数组num归并排序递归实现,len为数组长度,从小到大排序,O(nlog2^n),稳定
/*核心思想,将一个数组反复拆成两半,拆到每份只有一个元素
,再将其比较后合并从小到大存入新数组
*/
if(len > 1){//递归终止条件,只有一个元素就不能拆了
//将数组拆两半成list1和list2,list1指针永远指向初始数组地址
//list2指向后半段地址
int *list1 = num;
int list1_size = len/2;
int *list2 = num + len/2;
int list2_size = len - list1_size;
//递归拆左右两边,拆到每份只有一个元素
mergesort(list1,list1_size);
mergesort(list2,list2_size);
//再比较大小,合并两半数组
merging(list1,list1_size,list2,list2_size,len);
}
}
void merging(int *list1,int list1_size,int *list2,int list2_size,int len){
/*此方法用于合并两个数组,比较两个数组元素值大小
,从小到大存入新数组*/
int i,j,k,m;//分别为list1,list2,临时数组temp,初始数组num的下标
//temp数组长度为初始数组的长度len
int *temp = (int*)malloc(sizeof(int)*len);
i = j = k = 0;
//比较list1和list2元素大小,从小到大存入temp
while(i < list1_size && j < list2_size){
if(list1[i] < list2[j]){
temp[k++] = list1[i++];
}else{
temp[k++] = list2[j++];
}
}
//最后一个元素没比较到,找到并存入temp
while(i < list1_size){
temp[k++] = list1[i++];
}
while(j < list2_size){
temp[k++] = list2[j++];
}
//因为list1是指向初始数组num的指针,将temp存入list1
for(m=0; m < list1_size + list2_size; m++){
list1[m] = temp[m];
}
}