/************************************
--修改日期: 2009.5.29
--修改人: 吴强
--修改原因: 从前写的代码不够规范
--输入要求: 无
************************************/
#include
#include
#define N 20
main()
{
int i;
int iArr[N]={2, 5, 4, 3, 6, 11, 23, 42, 13, 16,
32, 12, 31, 52, 34, 25, 42, 34, 22,33 };
void MergeSort(int iArr[]);
void MergePass(int iArr[], int len);
void Merge(int iArr[], int low, int m, int high);
void MergeSortDC(int iArr[], int low, int high);
// MergeSortDC(iArr, 0, N-1);
MergeSort(iArr);
for (i= 0; i< N; i++)
{
printf("%d,",iArr[i]);
}
printf("/n");
}
//递归方法实现
void MergeSortDC(int iArr[], int low, int high)
{
int m;
/*顶和底下标相同则退出*/
if (low< high)
{
m=(low+high-1)/2;
/*用递归从顶找到低,然后从低在归并会顶*/
MergeSortDC(iArr, low, m);
MergeSortDC(iArr, m+1, high);
Merge(iArr, low, m, high);
}
}
void Merge(int iArr[],int low ,int m,int high)
{
int i=low;
int j=m+1;
int k=0;
int *p; /*利用一空间记录排序好的俩文件,最后付给iArr */
p=(int *)malloc( (high-low+1)*sizeof(int) );
if (!p)
{
printf("error");
exit(0);
}
/*俩个文件比较排序*/
while (i<= m && j<= high)
{
p[k++]=iArr[i]< iArr[j]? iArr[i++]:iArr[j++];
}
while (i<= m)
{
p[k++]=iArr[i++];
}
while (j<=high)
{
p[k++]=iArr[j++];
}
/*排序好的P付给iArr*/
for (i=low,k=0; i<= high; i++,k++)
{
iArr[i]=p[k];
}
}
//非递归方法实现
/*2路归并-自底向上 算法*/
void MergeSort(int iArr[])
{
int i;
/*i为数据归并的长度*/
for (i=1; i< N; i*=2)
{
MergePass(iArr, i);
}
}
void MergePass(int iArr[], int len)
{
int i;
for (i=0; i+2*len-1< N; i+=2*len)
{
/*归并|i、i+len-1为第一有序文件头,尾下标*/
Merge(iArr, i, i+len-1, i+2*len-1);
}
/*如果存在俩个长度不足够的,就归并他们*/
if (i+len-1< N)
{
/*n-1为最后一个元素下标*/
Merge(iArr, i, i+len-1, N-1);
}
}
归并Sort
最新推荐文章于 2024-11-19 23:28:53 发布
1299

被折叠的 条评论
为什么被折叠?



