排序算法之归并排序

归并排序的思想是分治思想。

第一,归并算法:把两个拍好序的数组合并成一个拍好序的数组:

void merge(int A[], int p, int q, int r)
{
int m = r - p + 1;
int i = p, j = q + 1, k = 0;

int* pb = new int[m];

while (i <= q && j <= r)
{
if (A[i] <= A[j])
{
pb[k++] = A[i++];
}
else
{
pb[k++] = A[j++];
}
}

while (i <= q)
{
pb[k++] = A[i++];
}
while (j <= r)
{
pb[k++] = A[j++];
}

for (i = p, k = 0; i <= r; i++, k++)
{
A[i] = pb[k];
}

delete [] pb;
}

第二,归并排序:把数组递归的分成两份,当每个数组都拍好序后,然后归并在一起。

void merge_sort(int A[], int n)
{
int i, s, t = 1;
while (t < n)
{
s = t;
t = 2 * t;
i = 0;

while (i + t < n)
{
merge(A, i, i + s - 1, i + t - 1);
i += t;
}

if (i + s < n)
{
merge(A, i, i + s - 1, n - 1);
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值