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