归并排序:
“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。无论是顺序存储结构还是链表存储结构,都可在O(m+n)的时间量级上实现。
基本思想:(1)初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1
(2)然后两两归并,得到[n/2]个长度为2或者1的有序子序列,再两两归并...
(3)如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2-路归并排序。
典型的“空间换时间”思想
时间复杂度:O(nlogn)
与堆排序相比较,归并排序最大的特点是,它是一种稳定的排序方法。
算法代码:
//将两个有序数组合并
void MSortArray(int array[], int temp[], int first, int mid, int last)
{
int p;
int i = first;
int j = mid+1;
int t = 0;
while (i <= mid&&j <=last)
{
if (array[i] < array[j])
{
temp[t] = array[i++];
}
else
{
temp[t] = array[j++];
}
t++;
}
while (i <= mid)
{
temp[t++] = array[i++];
}
while (j <= last)
{
temp[t++] = array[j++];
}
for (p = 0; p < t; p++)
{
array[first+p] = temp[p];
}
}
void MSort(int array[], int temp[], int first, int last)
{
if (first >= last)
return;
int mid = (first + last) / 2;
MSort(array, temp, first, mid);
MSort(array, temp, mid+1, last);
MSortArray(array,temp,first,mid,last);
}