C/C++教程

C语言:二分归并排序算法

本文主要是介绍C语言:二分归并排序算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、【实验目的及要求】

1.掌握分治策略的基本思想。

2.学会运用分子策略的思想解决实际问题(如:二分归并排序)。

3.掌握二分归并排序的思想以及运算步骤。

二、实验内容】

有待排序数组如下:

9

5

2

7

12

4

3

1

11

要求使用二分排序的思想将其排好序,排好的顺序如下:

1

2

3

4

5

7

9

11

12


代码:编译环境VS2019

#include<stdio.h>
#include<stdlib.h>
void print(int arr[], int n)//输出
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}putchar('\n');
}
void getone(int arr[], int tarr[], int left, int mid, int right)//排序且合并
{
	int L_arr = left;//左数组第一位
	int R_arr = mid + 1;//右数组第一位
	int i = left;
	while (L_arr <= mid && R_arr <= right)//左右组对比排序
	{
		if (arr[L_arr] < arr[R_arr])
		{
			tarr[i++] = arr[L_arr++];
		}
		else tarr[i++] = arr[R_arr++];
	}
	while (L_arr <= mid)//剩下左组排序
	{
		tarr[i++] = arr[L_arr++];
	}
	while (R_arr <= right)//剩下右组排序
	{
		tarr[i++] = arr[R_arr++];;
	}
	while (left <= right)//将临时数组的数据转移
	{
		arr[left] = tarr[left];
		left++;
	}
}
void gettwo(int arr[], int tarr[], int left, int right)//递归分组
{
	if (left < right)
	{
		int mid = (left + right) / 2;
		gettwo(arr, tarr, left, mid);
		gettwo(arr, tarr, mid + 1, right);
		getone(arr, tarr, left, mid, right);
	}
}
void merge(int arr[], int n)//分配空间
{
	int* tarr = (int*)malloc(n * sizeof(int));
	if (tarr)//分配成功
	{
		gettwo(arr, tarr, 0, n - 1);
		free(tarr);//释放临时数组空间
	}
	else printf("error!");//分配失败
}
int main(int argc, char const* argv[])
{
	int arr[] = { 9,5,2,7,12,4,3,1,11 };
	int n = 9;
	printf("排序前:\n");
	print(arr, n);
	merge(arr, n);
	printf("排序后:\n");
	print(arr, n);
	return 0;
}

运行结果:

 

这篇关于C语言:二分归并排序算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!