算法导论:c++归并排序
基本思想就是把数组一直分成两半,然后对这两半进行排序归并。
先分成左右两半,然后合并时比较左右两半一直选最小的替代原数组。这种排序是非原址的,需要额外的空间。
伪代码非常简单,采用分治的思想:
合并的伪代码:
一趟合并的示意图:
代码实现
/*归并排序合并部分*/
void merge(int array[], int p, int q, int r) {
int n1 = q - p + 1; //左半边数组长
int n2 = r - q;
int i=0,j = 0;
vector<int> left(n1+1);
vector<int> right(n2+1);
for (i = 0; i < n1; i++) //左半边数组
{
left[i] = array[p+i];
}
left[n1] = INT_MAX; //最后一个元素置为最大
for (j=0; j < n2; j++) //右半边数组
{
right[j] = array[q + j + 1];
}
right[n2] = INT_MAX; //最后一个元素置为最大
i = 0;
j = 0;
for (int k = p; k <=r; k++) //注意此处边界条件,k要等于r
{
if (left[i] < right[j]) //每次取最小
{
array[k] = left[i];
i++;
}
else
{
array[k] = right[j];
j++;
}
}
}
/*归并排序*/
void merge_sort(int array[], int p, int r) {
if (p < r) {
int q = (p + r) / 2;
merge_sort(array, p, q);
merge_sort(array, q + 1, r);
merge(array, p, q, r);
}
}
测试
int main()
{
const int len = 8;
int array[len] = { 2,8,7,1,3,5,6,4};
merge_sort(array, 0, 7);
for (int i = 0; i < len; i++)
{
cout << array[i] << " ";
}
}
输出:1 2 3 4 5 6 7 8
还没有评论,来说两句吧...