介绍:
归并排序是一种对序列进行排序的算法
首先,取一个中间值,有中间值,直接把序列分为两段,对两端序列分别排序
接下来会用到“双指针算法”,两个指针分别指向两段序列的头,比较大小,把小的取出,再把取出的序列指针后移,直到某一序列被全部遍历,直接把另一端拼接到取出来的元素组成的序列后面。
其中,在切割后取元素排序时,若两数字相同,一般取第一段序列中的元素,有利于维持稳定性(排序后与排序前元素位置不变)
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int n;
int q[N],temp[N];
//归并排序法
void merge_sort(int q[], int l, int r)
{
if (l >= r) return;
int mid = q[(l + r) / 2];
merge_sort(q, l, mid); merge_sort(q, mid + 1, r);
int k = 0, i = 1, j = mid + 1;
while (i <= mid && j <= r)
if (q[i] <= q[j]) temp[k++] = q[i];
else temp[k++] = q[j];
while (i <= mid) temp[k ++] = q[i ++];
while (j <= r) temp[k++] = q[j++];
for (i = 1, j = 0; i <= r; i++, j++) q[i] = temp[j];
}
int main()
{
scanf_s("%d", &n);
for (int i = 0; i < n; i++) scanf_s("%d", &q[i]);
merge_sort(q, 0, n - 1);
for (int i = 0; i < n; i++) printf("%d", q[i]);
return 0;
}
这是什么意思,stack overflow好像是栈溢出?但自己不知道怎么修改,头发都要掉没了!