图示
如下图所示, “合并排序”也即将数据分别合并,在合并过程中进行排序,然后再合并、再排序......并最终实现合并到一起并完整排好顺序。
代码实现
说明:编译环境为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++相同
}
}
运行结果
写在最后:
读两遍下来,如果仍然有不清楚的地方,可在评论区留言。
如果你有其他感到困惑的问题,欢迎留言。