C语言实现-合并排序法

图示

        如下图所示, “合并排序”也即将数据分别合并,在合并过程中进行排序,然后再合并、再排序......并最终实现合并到一起并完整排好顺序。

代码实现

        说明:编译环境为DevC++。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX1 10
#define MAX2 10
#define SWAP(x,y) {int t; t = x; x = y; y = t;} //用宏定义定义函数SWAP用于数据交换

//函数声明
int partition(int[], int, int); 
void quicksort(int[], int, int);
void mergesort(int[], int, int[], int, int[]);

//主函数
int main() {
	int number1[MAX1] = {0}; 
	int number2[MAX1] = {0};
	int number3[MAX1+MAX2] = {0}; 
	int i, num;
	
	srand(time(NULL)); 刷新每次产生的随机数,若无此句,每次随机数相同,亲自尝试一下便知
	printf("排序前:");
	printf("\nnumber1[]:"); 
	for(i = 0; i < MAX1; i++){
		number1[i] = rand() % 100; //产生0-99的随机数,这里没有采用固定的数组值进行排序,随机生成
		printf("%d ", number1[i]);//输出数组数据
	}
	
	printf("\nnumber2[]:"); 
	for(i = 0; i < MAX2; i++){
		number2[i] = rand() % 100; //产生0-99的随机数,这里没有采用固定的数组值进行排序,随机生成
		printf("%d ", number2[i]);//输出数组数据
	}
	
	// 先排序两个数组
	quicksort(number1, 0, MAX1-1);
	quicksort(number2, 0, MAX2-1); 
	printf("\n排序后:"); 
	printf("\nnumber1[]:");
	for(i = 0; i < MAX1; i++){
		printf("%d ", number1[i]);
	}
	printf("\nnumber2[]:");
	for(i = 0; i < MAX2; i++){
		printf("%d ", number2[i]);
	}

	// 合并排序
	mergesort(number1, MAX1, number2, MAX2, number3); 
	printf("\n合并后:");
	for(i = 0; i < MAX1+MAX2; i++){
		printf("%d ", number3[i]);
	}
	printf("\n"); 
	return 0;
}
	
int partition(int number[], int left, int right){ 
	int i, j, s;
	s = number[right]; 
	i = left - 1;
	
	for(j = left; j < right; j++){ 
		if(number[j] <= s){
			i++;
			SWAP(number[i], number[j]);//元素交换
		}
	}
	
	SWAP(number[i+1], number[right]); //元素交换
	return i+1;
}

void quicksort(int number[], int left, int right){ 
	int q;
	if(left < right){
		q = partition(number, left, right); 
		quicksort(number, left, q-1); 
		quicksort(number, q+1, right);
	}
}

void mergesort(int number1[], int M, int number2[], int N, int number3[]){ 
	int i = 0, j = 0, k = 0;
	while(i < M && j < N){ 
		if(number1[i] <= number2[j]){
			number3[k++] = number1[i++];
		}
		else{
			number3[k++] = number2[j++]; 
            //这里number3[k++]相当于number3[k] 和 k++两条语句结合在一起
            //即先执行number[k],之后执行k++,k自增1
            //同理,j++相同
		}
	}
	while(i < M){
		number3[k++] = number1[i++];
        //这里number3[k++]相当于number3[k] 和 k++两条语句结合在一起
        //即先执行number[k],之后执行k++,k自增1
        //同理,i++相同
	}
	while(j < N){
		number3[k++] = number2[j++];
        //这里number3[k++]相当于number3[k] 和 k++两条语句结合在一起
        //即先执行number[k],之后执行k++,k自增1
        //同理,j++相同
	}
}

运行结果

写在最后:

        读两遍下来,如果仍然有不清楚的地方,可在评论区留言。

        如果你有其他感到困惑的问题,欢迎留言。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等日出看彩虹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值