排序算法---归并排序递归实现(C语言)

归并排序递归实现

#include 
#include //导入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];
	}
}

你可能感兴趣的:(c语言,算法,数据结构,排序算法)