理论原理:
代码实现:
#include <iostream>
#include <time.h>
#include <windows.h>
using namespace std;
#define MAX 10000000
static int *temp=new int[MAX];
int* createArray()
{
int *arr=new int[MAX];
for(int i=0;i<MAX;i++)
{
arr[i]=rand()%MAX;
}
return arr;
}
void Merge(int *arr,int start,int end,int mid);
void Merge_Sort(int *arr,int start,int end)
{
if(start>=end)
{
return;
}
//中间值
int mid=(start+end)/2;
//左边分割
Merge_Sort(arr,start,mid);
//右边分割
Merge_Sort(arr,mid+1,end);
//归并
Merge(arr,start,end,mid);
}
void Merge(int *arr,int start,int end,int mid)
{
int i_start=start;
int i_end=mid;
int j_start=mid+1;
int j_end=end;
//表示临时空间内的数据大小
int size=0;
//归并
while (i_start<=i_end && j_start<=j_end)
{
if(arr[i_start]<arr[j_start])
{
temp[size]=arr[i_start];
i_start++;
size++;
}
else
{
temp[size]=arr[j_start];
j_start++;
size++;
}
}
//处理剩余
while (i_start<=i_end)
{
temp[size]=arr[i_start];
i_start++;
size++;
}
while (j_start<=j_end)
{
temp[size]=arr[j_start];
j_start++;
size++;
}
//写回原处
for(int i=0;i<size;i++)
{
arr[start+i]=temp[i];
}
}
void printArray(int *arr,int length)
{
for(int i=0;i<length;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
}
int main()
{
srand(time(NULL));
int *arr=createArray();
DWORD start=GetTickCount();
// printArray(arr,MAX);
Merge_Sort(arr,0,MAX-1);
// printArray(arr,MAX);
DWORD end=GetTickCount();
cout<<"归并排序"<<MAX<<"个数据用时:"<<end-start<<endl;
return 0;
}
运行结果: