Algorithm Gossip (40) 合并排序法

前言

This Series aritcles are all based on the book 《经典算法大全》; 对于该书的所有案例进行一个探究和拓展,并且用python和C++进行实现; 目的是熟悉常用算法过程中的技巧和逻辑拓展。

提出问题

40.Algorithm Gossip:合并排序法
分治思想, 略; 我另外一篇文章有说明

分析和解释

代码

#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;}
int partition(int[], int, int);
void quicksort(int[],int,int);
void mergesort(int[],int,int[],int, int[]);
int main(void) {
	int number1[MAX1]= {0};
	int number2[MAX1]= {0};
	int number3[MAX1+MAX2]= {0};
	int i, num;
	srand(time(NULL));
	printf("排序前:");
	printf("
number1[]:");
	for(i = 0; i < MAX1;i++){
		number1[i] = rand()% 100;
		printf("%d ", number1[i]);
		}
	printf("
number2[]:");
	for(i = 0; i < MAX2;i++){
		number2[i] = rand()% 100;
		printf("%d ", number2[i]);
		}
	// 先排序两笔资料
	quicksort(number1, 0, MAX1-1);
	quicksort(number2, 0, MAX2-1);
	printf("
排序后:");
	printf("
number1[]:");
	for(i = 0; i < MAX1;i++)
		printf("%d ", number1[i]);
	printf("
number2[]:");
	for(i = 0; i < MAX2;i++)
		printf("%d ", number2[i]);
	// 合并排序
	mergesort(number1,MAX1,number2,MAX2,number3);
	printf("
合并后:");
	for(i = 0; i < MAX1+MAX2;i++)
		printf("%d ", number3[i]);
	printf("
");
	return 0;
	}
int partition(int number[], intleft, 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(intnumber[], 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(intnumber1[], 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++];
		}
	while(i < M)
		number3[k++]= number1[i++];
	while(j < N)
		number3[k++]= number2[j++];
	}

拓展和关联

后记

参考书籍

  • 《经典算法大全》
  • 维基百科
原文地址:https://www.cnblogs.com/actanble/p/6711159.html