合并排序算法(C语言版)

#include <stdio.h>

void Copy(int *a, int *b, int left, int right) {

int i;

for(i=0;i<right-left+1;i++)

{

a[i+left] = b[i];

}

}

// 将 a[left,middle] 和 a[middle+1,right]合并到 b[left, right]中

void Merge(int *a, int left, int middle, int right) {

int b[right-left+1];

int i = left; // left 到 middle 这一段的起始位置

int j = middle + 1; // middle+1 到 right 这一段的起始位置

int k = 0; // 保存到 b 数组中的对应位置索引

int q; // 循环变量

// 当 a[1,middle] 和 a[middle+1,right] 中都有元素时,小的保存到 b 数组中

while((i<=middle)&&(j<=right)){

if(a[i]<=a[j]){

b[k] = a[i];

i++;

}else{

b[k] = a[j];

j++;

}

k++;

}

// 把余下部分加入到数组中

if(i>middle){ // 将 a[middle+1,right]中剩余部分拷贝到 b 数组当中

for(q=j; q<=right; q++){

b[k] = a[q];

k++;

}

}else{ // 将 a[1,middle]中剩余部分拷贝到 b 数组当中

for(q=i; q<=middle; q++){

b[k] = a[q];

k++;

}

}

Copy(a, b, left, right); // 复制回数组 a

}

// 递归写法

void MergeSort(int *a, int left, int right){

int middle;

if(left < right){ // 当至少有两个元素时

middle = (left + right)/2; // 取中点

MergeSort(a, left, middle); // 对 a[left,middle] 进行合并排序

MergeSort(a, middle+1, right); // 对 a[middle+1,right] 进行合并排序

Merge(a, left, middle, right); // 合并到数组 a

}

}

int main() { //定义 main()主函数

int arrayLength,i;

printf("请输入要合并排序的数组大小:(数组最大上限100)\n");

scanf("%d",&arrayLength);

int a[arrayLength];

printf("请输入待排序序列:\n");

for(i=0; i<arrayLength; i++){ //a控制数组大小

scanf("%d",&a[i]);

}

MergeSort(a, 0, arrayLength-1);

printf("合并排序后的数组为:\n");

for( i=0; i<arrayLength; i++){

printf("%d ",a[i]);

}

return 0;

}

相关推荐
无限大.21 分钟前
力扣题解3248 矩阵中的蛇(简单)
算法·leetcode·矩阵
灼华十一27 分钟前
算法编程题-排序
数据结构·算法·golang·排序算法
谁在夜里看海.29 分钟前
【从零开始的算法学习日记✨优选算法篇✨】第二章:流动之窗,探索算法的优雅之道
c++·学习·算法
SoraLuna1 小时前
「Mac玩转仓颉内测版25」基础篇5 - 布尔类型详解
开发语言·算法·macos·cangjie
先鱼鲨生1 小时前
排序【数据结构】【算法】
数据结构·算法·排序算法
时光の尘2 小时前
C语言菜鸟入门·关键字·void的用法
c语言·开发语言·c++·算法·c#·c·关键字
蚂蚁没问题s2 小时前
图像处理 - 色彩空间转换
图像处理·人工智能·算法·机器学习·计算机视觉
戊子仲秋2 小时前
【LeetCode】每日一题 2024_11_21 矩阵中的蛇(模拟)
算法·leetcode·矩阵
HP-Patience2 小时前
【机器学习】- 模型复杂度vs模型误差
python·算法·机器学习
螺旋天光极锐斩空闪壹式!2 小时前
第十三课 二维数组(2)方向数组
开发语言·c++·算法