软考软件设计师下午真题-算法分析与设计-分治法(2014年上半年试题四)C代码讲解

软考软件设计师下午真题-算法分析与设计-分治法(2014年上半年试题四)C代码讲解

  • 说明
  • C代码

说明

采用归并排序对n个元素进行递增排序时,首先将n个元素的数组分成各含n/2个元素的两个子数组,然后用归并排序对两个子数组进行递归排序,最后合并两个已经排好序的子数组得到排序结果。

C代码

(1)常量和变量说明
arr:待排序数组
p,q,r:一个子数组的位置为从p到q,另一个子数组的位置为从q+1到r
begin,end:待排序数组的起止位置
left,right:临时存放待合并的两个子数组
n1,n2:两个子数组的长度
i,j,k:循环变量
mid:临时变量
(2)C程序

#include 
#include 
#define MAX 65536

void merge(int arr[], int p, int q, int r) {	//将两个有序数组合并成一个更大的有序数组
	int *left, *right;
	int n1, n2, i, j, k;
	n1 = q-p+1;
	n2 = r-q;
	if ((left = (int*)malloc((n1 + 1)*sizeof(int))) == NULL) {	//申请left数组的内存空间
		perror("malloc error");
		exit(1);
	}
	if ((right = (int*)malloc((n2 + 1)*sizeof(int))) == NULL) {	//申请right数组的内存空间
		perror("malloc error");
		exit(1);
	}
	for (i = 0; i < n1; i ++ ) {
		left[i] = arr[p + i];	//将有序的子数组arr的元素放入left数组中
	}
	left[i] = MAX;
	for (i = 0; i < n2; i ++ ) {
		right[i] = arr[q + i + 1];	//将有序的子数组arr的元素放入right数组中
	}
	right[i] = MAX;
	i = 0; j = 0;
	for (k=p;k<r+1;k++ ) {	//将right和left元素放入arr中,放入位置是从p到r
		if (left[i] > right[j]) {	//依次比较left和right数组中的元素
			arr[k]=right[j];	//将right数组的元素放入arr数组中
			j ++ ;
		} else {
			arr[k] = left[i];	//将left数组的元素放入arr数组中
			i ++ ;
		}
	}
}

void mergeSort(int arr[], int begin, int end) {	//数组排序
	int mid;
	if (begin<end) {	//若数组元素个数大于1,则从arr[begin]到arr[end]继续划分
		mid = (begin + end) / 2;
		mergeSort(arr, begin, mid);	//划分为从arr[begin]到arr[mid]
		mergeSort(arr, mid+1, end);	//划分为从arr[mid+1]到arr[end]
		merge(arr, begin, mid, end);
	}
}

你可能感兴趣的:(软考软件设计师,算法,c语言,数据结构)