33,006
社区成员
发帖
与我相关
我的任务
分享
#pragma warning(disable:4786)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <math.h>
using namespace std;
const int NUM=20;
int arr[] = {1,10,11,5,6,15,0,15,16,14,0,8,17,15,7,19,17,1,18,7};
void merge(int v[],int left,int mid,int right) //合并[left,mid]和[mid+1,right]
{
int i,j,k=0;
i=left; //i为第一路的下标
j=mid+1; //j为第二路的下标
int *temp=new int[right-left+1];
while(i<=mid&&j<=right)
temp[k++]=(v[i]<=v[j])?v[i++]:v[j++]; //依次合并2路到temp数组
while(i<=mid)
temp[k++]=v[i++];
while(j<=right)
temp[k++]=v[j++];
for(i=left,j=0;i<=right;++i,++j) //合并完数据写回v数组
v[i]=temp[j];
delete []temp;
}
void merge_sort(int v[],int num)
{
int i,size,j,mid,right;
for(i=1;i<num;i*=2) //log(n)趟归并
{
size=i-1;
j=0;
while(j<num)
{
mid=j+size;
right=j+2*size+1;
if(mid>=num) //下标不能溢出
mid=num-1;
if(right>=num)
right=num-1;
merge(v,j,mid,right);
j=right+1;
}
}
}
void main()
{
int j;
merge_sort(arr, NUM);
for(j=0; j<NUM; j++)
printf("%d ", arr[j]);
printf("\n");
}