合并排序算法

基本思想:将待排序元素分为大小一致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。

1.将一个集合分成两个大小一致的2个子集合:

2.先对左右两边两个子集进行排序,需要再次分成两个更小的子集。分集合直到子数组的长度为1时停止递归。

3.对上诉子集合分别进行排序并合成大集合

代码:

1.对大集合不断划分成相等的两个小集合:mid=(right+left)/2,左边小集合为(left,mid),右边小集合为(mid+1,right)

void mergeSort(int A[],int left,int right) {
	if (left==right) {
		return;
	}
	if (left<right) {
		int mid = (right + left) / 2;
		mergeSort(A,left,mid);
		mergeSort(A,mid+1,right);
	}
}

2.分成直到子数组的长度为1时进行排序并合成大集合:范围是(left,right)

merge(A,left,right);

        2.1两个小的集合进行排序并合成大集合,比较左边集合和右边集合的第一个数据哪个小就放在第一个位置,以上诉例子为基础:排序(左边集合1 3 9和右边集合2 5 8)

1和2比,1小,放第一位,3和2比,2小放第二位,9和5比,5小放第三位,9和8比,8小放第四位,剩下的未放置的9直接跟在新集合的后面。

void merge(int A[], int left, int right) {
	//排序合并
	int n = right - left + 1;
	int *b=(int *)malloc(sizeof(int)* n);
	int i = 0, mid = (right + left) / 2;
	int l = left, k = mid + 1;
	while ((l<= mid) && (k <= right)) {
		if (A[l] < A[k]) {//左边集合跟右边集合的数进行比较,谁小谁放前面
			b[i++] = A[l++];
		}
		else {
			b[i++] = A[k++];
		}
	}
	if (l > mid) {
		//后面一个小分组还有剩余未处理的数
		for (k; k <= right; k++) {
			b[i++] = A[k];//直接放在新集合的后面
		}
	}
	if (k>right) {
		//前面小分组还有剩余未处理的数
		for (l; l <= mid;l++) {
			b[i++] = A[l];
		}
	}

	//再将b数组中的数据全部复制到A中
	for (int j = 0; j < n;j++) {
		A[left+j] = b[j];
	}
	free(b);
}

完整代码:

#include<stdio.h>
#include<malloc.h>

//打印排序好的数组
void printfA(int A[], int n) {
	for (int i = 0; i < n; i++) {
		printf("%d ", A[i]);
	}
	printf("\n");
}

void merge(int A[], int left, int right) {
	//排序合并
	int n = right - left + 1;
	int *b=(int *)malloc(sizeof(int)* n);
	int i = 0, mid = (right + left) / 2;
	int l = left, k = mid + 1;
	while ((l<= mid) && (k <= right)) {
		if (A[l] < A[k]) {
			b[i++] = A[l++];
		}
		else {
			b[i++] = A[k++];
		}
	}
	if (l > mid) {
		//后面一个小分组还有剩余未处理的数
		for (k; k <= right; k++) {
			b[i++] = A[k];
		}
	}
	if (k>right) {
		//前面小分组还有剩余未处理的数
		for (l; l <= mid;l++) {
			b[i++] = A[l];
		}
	}

	//再将b数组中的数据全部复制到A中
	for (int j = 0; j < n;j++) {
		A[left+j] = b[j];
	}
	free(b);
}



void mergeSort(int A[],int left,int right) {
	if (left==right) {
		return;
	}
	if (left<right) {
		int mid = (right + left) / 2;
		mergeSort(A,left,mid);
		mergeSort(A,mid+1,right);
		merge(A,left,right);
	}
}


int main() {
	int n;
	printf("请输入排序数字得个数:");
	scanf_s("%d",&n);
	int *A = (int*)malloc(sizeof(int)*n);
	printf("请输入排序得数字:");
	for (int i = 0; i < n;i++) {
		scanf_s("%d",&A[i]);
	}
	mergeSort(A,0,n-1);
	printfA(A, n);
	free(A);
	return 0;
}

相关推荐

  1. 合并排序算法

    2024-04-29 07:40:04       58 阅读
  2. 排序算法合并两个有序数组

    2024-04-29 07:40:04       58 阅读
  3. 合并排序算法的时间复杂度是多少?

    2024-04-29 07:40:04       48 阅读
  4. 数据结构—两个有序单链表的合并排序算法

    2024-04-29 07:40:04       47 阅读
  5. 排序算法——冒泡排序

    2024-04-29 07:40:04       62 阅读
  6. 排序算法——快速排序

    2024-04-29 07:40:04       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-29 07:40:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-29 07:40:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-29 07:40:04       87 阅读
  4. Python语言-面向对象

    2024-04-29 07:40:04       96 阅读

热门阅读

  1. c/c++传值和传引用的区别

    2024-04-29 07:40:04       32 阅读
  2. Pytorch中保存模型的两种方法

    2024-04-29 07:40:04       30 阅读
  3. 基于 PyTorch 框架写一个图片分类模型

    2024-04-29 07:40:04       34 阅读
  4. C++Webserver服务器常见面试问题总结

    2024-04-29 07:40:04       27 阅读
  5. python代码实现支持向量机对鸢尾花分类

    2024-04-29 07:40:04       37 阅读
  6. webpack配置文件

    2024-04-29 07:40:04       29 阅读
  7. 华为OD机试-螺旋数字矩阵

    2024-04-29 07:40:04       38 阅读
  8. Hive EXPLAIN 执行计划解析

    2024-04-29 07:40:04       34 阅读