归并排序:(时间复杂度O(N*lg(N)))
思想:把数组划分为两段区间,假设两段区间都有序,则合并的区间也有序。
步骤:
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 重复步骤3直到某一指针达到序列尾
代码:
Sort.h
#pragma once
//[left,right]
void _MergeSort(int* a, int left, int right, int* tmp)
{
if (left >= right)
return;
int mid = left + ((right - left) >> 1);//[left,mid] [mid+1,right]
_MergeSort(a, left, mid, tmp);
_MergeSort(a, mid + 1, right, tmp);
int begin1 = left, end1 = mid;
int begin2 = mid+1, end2 = right;
size_t index = left;
while (begin1 <= end1 && begin2 <= end2)
{
if (a[begin1] < a[begin2])
{
tmp[index++] = a[begin1++];
}
else
{
tmp[index++] = a[begin2++];
}
}
while (begin1 <= end1)
{
tmp[index++] = a[begin1++];
}
while (begin2 <= end2)
{
tmp[index++] = a[begin2++];
}
memcpy(a + left, tmp + left, sizeof(int)*(right - left + 1));
}
void MergeSort(int* a, size_t n)
{
int* tmp = new int[n];
_MergeSort(a, 0, n-1, tmp);
delete[] tmp;
}
void TestMergeSortt()
{
int a[] = { 2, 5, 0, 9, 3, 6, 1, 7, 1 };
MergeSort(a,sizeof(a) / sizeof(a[0]));
PrintArray(a, sizeof(a) / sizeof(a[0]));
}
Test.cpp
#include<iostream>
#include<assert.h>
using namespace std;
#include"Sort.h"
int main()
{
TestMergeSortt();
system("pause");
return 0;
}