归并排序
作者:互联网
基本思路
1.先将序列中的每个数字单独设为一组;
2.再将每两个组合中的数字合并为一个组合,保证组合后的数字是有序的;
3.重复第二步,直到只剩下一组。
具体步骤
1.将序列中的每个数字单独设为一组
2.两两合并,并保持有序
3.再将得到的组合再次两两合并
4.继续两两合并
代码模板
#include<bits/stdc++.h>
using namespace std;
const int N = 100000;
int n;
int arr[N] = { 0 };
int tmp[N];
void merge_sort(int arr[], int l, int r)
{
if (l >= r)//左右指针重合,返回
{
return;
}
int mid = (l + r) / 2;
merge_sort(arr, l, mid);//递归排序左边
merge_sort(arr, mid + 1, r);//递归排序右边
//以下归并,把结果放入tmp
int k = 0;
int i = l, j = mid + 1;//i为左边最开始点,j为右边最开始点;
while (i <= mid && j <= r)//当左半边和右半边都没有循环空的话;
{
if (arr[i] <= arr[j])
{
tmp[k++] = arr[i++];//把每一个小的放在我们当前位置上去;
}
else
{
tmp[k++] = arr[j++];
}
}
while (i <= mid)//这两个while是如果有一边没有循环完的话,直接接入答案;
{
tmp[k++] = arr[i++];
}
while (j <= r)
{
tmp[k++] = arr[j++];
}
for (i = l, j = 0; i <= r; i++, j++)
{
arr[i] = tmp[j];//把存在tmp的结果赋值回arr;
}
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
merge_sort(arr, 0, n - 1);
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
标签:sort,归并,int,arr,mid,merge,排序 来源: https://www.cnblogs.com/RimekeyBergling/p/16395797.html