前言
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++];
}
拓展和关联
后记
参考书籍
- 《经典算法大全》
- 维基百科