您的位置:首页 > 编程语言 > C语言/C++

归并排序

2015-07-28 17:58 190 查看
(一)两路归并排序

时间复杂度:O(nlogn)

平均时间复杂度:O(nlogn)

最差空间复杂度:O(n)

稳定性:稳定

两路归并排序(Merge Sort),也就是我们常说的归并排序,也叫合并排序。它是建立在归并操作上的一种有效的排序算法,归并操作即将两个已经排序的序列合并成一个序列的操作。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

归并操作的基本步骤如下:

1.申请两个与已经排序序列相同大小的空间,并将两个序列拷贝其中;

2.设定最初位置分别为两个已经拷贝排序序列的起始位置,比较两个序列元素的大小,依次选择相对小的元素放到原始序列;

3.重复2直到某一拷贝序列全部放入原始序列,将另一个序列剩下的所有元素直接复制到原始序列尾。

设归并排序的当前区间是R[low..high],分治法的三个步骤是:

1.分解:将当前区间一分为二,即求分裂点

2.求解:递归地对两个子区间R[low..mid]和R[mid+1..high]进行归并排序;

3.组合:将已排序的两个子区间R[low..mid]和R[mid+1..high]归并为一个有序的区间R[low..high]。

递归的终结条件:子区间长度为1(一个记录自然有序)。

算法示意图:



代码实现:
void Merge(int ArrayInput[], int p, int q, int r)
{
int n1 = q - p +1;
int n2 = r - q;

int* L1 = new int[n1 + 1];
int* L2 = new int[n2 + 1];
int i,j,k;

for(i = 0; i < n1; ++i)
{
L1[i] = ArrayInput[p + i];
}

for(j = 0; j < n2; ++j)
{
L2[j] = ArrayInput[q+1+j];
}

L1[n1] = 1000000;
L2[n2] = 1000000;

for(i = 0,j =0 ,k = p; k <=r; ++k)
{
if(L1[i] <= L2[j])
{
ArrayInput[k] = L1[i];
++i;
}
else
{
ArrayInput[k] = L2[j];
++j;
}
}

delete []L1;
delete []L2;

}

void MergeSort(int ArrayInput[], int p, int r)
{
if(p < r )
{
int q = (p + r)/2;
MergeSort(ArrayInput, p ,q);
MergeSort(ArrayInput, q+1, r);
Merge(ArrayInput, p, q, r);
}
}


文章转自:http://blog.csdn.net/left_la/article/details/8656953
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 归并排序