您的位置:首页 > 其它

归并排序

2016-10-05 12:04 113 查看

归并排序------稳定

注:一个无序的数组用归并排序

分治法,分成俩个有序的数组,然后进行比较合并为一个有序的数组
时间复杂度:O(NlogN);
空间复杂度:O(N);

<span style="font-size:18px;">//直接插入排序
void InsertSort(int* arr,int len)
{
if (arr == NULL && len <= 0)
return;

for (int i = 0; i < len - 1; ++i)
{
int end = i;
int cur = arr[end + 1];				//待插入的数据

// 挪动数据
while (end >= 0 && arr[end] > cur)
{
arr[end + 1] = arr[end];
--end;
}
arr[end + 1] = cur;
}
}

void MergeSort(int* src, int* dst,int left, int mid, int right)
{
assert(src);
assert(dst);

int begin1 = left;
int end1 = mid;
int begin2 = mid;
int end2 = right;

int index = begin1;
while (begin1 < end1 && begin2 < end2)
{
if (src[begin1] < src[begin2])
dst[index++] = src[begin1++];
else
dst[index++] = src[begin2++];
}

while (begin1 < end1)
dst[index++] = src[begin1++];
while (begin2 < end2)
dst[index++] = src[begin2++];

memcpy(src + left, dst + left, (right - left)*sizeof(int));
}
void _merge(int* src, int* dst,int left, int right)
{
assert(dst);
assert(src);

if (left + 1 >= right)
return;

//递归优化
if (right - left < 3)
{
InsertSort(src, right - left);
return;
}

int mid = left + (right - left) / 2;

//递归左右区间
_merge(src, dst, left, mid);
_merge(src, dst, mid, right);

//合并左右区间
MergeSort(src, dst, left, mid, right);
}

void Merge(int* arr, int len)
{       //tmp是一个临时保存排好序的数组
int* tmp = new int[len];

_merge(arr, tmp, 0, len);

delete[] tmp;
}
</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: