#include <iostream>
#include <assert.h>
#include <vector>
using namespace std;
void merge(int *data, int low, int mid, int high, int *tmp)
{
int i = low;
int j = mid + 1;
int k = low;
while (i <= mid&&j <= high)
{
if (data[i] <= data[j])
{
tmp[k++] = data[i++];
}
else
{
tmp[k++] = data[j++];
}
}
while (i <= mid)
{
tmp[k++] = data[i++];
}
while (j <= high)
{
tmp[k++] = data[j++];
}
/*for (i = low; i <= high; i++)
{
data[i] = tmp[i];
}*/
memcpy((void*)(data+low), (void*)(tmp+low), (high - low+1)*sizeof(tmp[0]));
}
//归并排序,采用分治理策略,将数组分为前半段和后半段,
//对子段再进行归并排序,之后两个有序数组合并排列
void mergesort_drive(int *data, int len,int *tmp)
{
if (len != 1 && data != NULL)
{
int mid = (len-1) / 2;
int high = len - 1;
int preLen = mid + 1;
mergesort_drive(data, preLen, tmp);//前半段数组排序
mergesort_drive(data + preLen, len - preLen, tmp);//后半段数组排序
merge(data, 0, mid, high, tmp);//两个有序数组合并
}
}
int main(void)
{
int data[10] = { 8, 7, 2, 6, 9, 10, 3, 4, 5, 1 };
int len = sizeof(data) / sizeof(data[0]);
int *tmp = new int[len];
mergesort_drive(data, len,tmp); //排序
for (int i = 0; i < 10; i++)
cout << data[i] << " ";
delete[]tmp;
return 0;
}
12-22
04-29
04-29
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交