C编程——归并排序

1、程序文件

/*
	归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用
	分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,
	得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
	
	归并操作的工作原理如下:
	第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
	第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
	第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
	重复步骤3直到某一指针超出序列尾
	将另一序列剩下的所有元素直接复制到合并序列中

*/

#include <stdio.h>

void mySwap(int *a, int i, int j)
{
	int tmp = a[i];
	a[i] = a[j];
	a[j] = tmp;
}

void myPrint(int *a, int len)
{
	int i;
	for (i = 0; i < len; i++)
	{
		printf ("%4d", a[i]);
	}
	printf ("\n");
}

// 合并函数  
void merge(int *a, int left, int mid, int right, int *tmp)
{
	// 左半边数组下标
	int i = left;    
	// 右半边数组下标
	int j = mid+1;  
	// 临时数组使用的下标
	int k = 0;     
	
	while(i <= mid && j <= right)
	{
		if (a[i] < a[j])
			tmp[k++] = a[i++];
		else
			tmp[k++] = a[j++];
	}
	
	while(i <= mid)
	{
		tmp[k++] = a[i++];
	}
	
	while (j<=right)
	{
		tmp[k++] = a[j++];
	}
	
	// 将临时数组里的变成有序的数组重新导入原来的数组的原来位置
	for(i = 0; i < k; i++)
	{
		
		a[left+i] = tmp[i];
	}
}

// 左边界 右边界 一个临时的数组
// tmp:用于临时存储合并的结果
void mergeSort(int *a, int left, int right, int *tmp)
{
	// 把数组分成两部分,分别进行排序
	int mid = (left+right)/2;
	
	// 左边小于右边方进行归并
	// 否则结束递归调用
	if (left < right)
	{
		// 对左边数组进行归并排序
		// 左边有序
		mergeSort(a, left, mid, tmp);   
		// 对右边数组进行归并排序
		// 右边有序
		mergeSort(a, mid+1, right, tmp);  
		// 合并左右两个数组
		// 有序的将两个数组合并
		merge(a, left, mid, right, tmp);  
	}
}

int main()
{
	int a[] = {5,8,6,7,9,4,3,2,1,0};
	int len = sizeof(a)/sizeof(a[0]);
	
	int tmp[10];
	mergeSort(a, 0, len-1, tmp);
	myPrint(a, len);
	
	return 0;
}

2、测试结果

root@lj:/mnt/hgfs/shared-lj# gcc 归并排序study.c 
root@lj:/mnt/hgfs/shared-lj# ./a.out 
0   1   2   3   4   5   6   7   8   9 

猜你喜欢

转载自blog.csdn.net/ypjsdtd/article/details/85197246