网站中怎么插入flash/sem广告投放是做什么的
题目链接 :点击查看
题目描述:
给定你一个长度为 nn 的整数数列。请你使用归并排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。
输入输出:
输入
5
3 1 2 4 5
输出
1 2 3 4 5
题目分析 : 归并排序与快速排序有着异曲同工之妙,归并排序是将区间通过递归不断二分并排序,然后将进行区间归并。而快速排序则是先将区间排序,在进行递归操作。他们都是基于分治法的思想,而且都运用了双指针(模拟)对区间进行操作。对于归并排序,其基本思路为:第一,先确定分界点(通常为中间点)。第二,对区间左右两边进行递归排序。第三,进行区间的归并操作。
代码:
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 1e5 + 10;
int arr[N], temp[N];//temp为辅助数组
int n;
void merge_sort(int *arr, int l, int r) {if (l >= r)return ;int mid = l + r >> 1;//确定分界点 (中间点) merge_sort(arr, l, mid);merge_sort(arr, mid+1, r); int k = 0, i = l, j = mid + 1; // i, j分别模拟指向二分后每个数组的起始位置的指针while (i <= mid && j <= r) {if (arr[i] <= arr[j]) temp[k ++ ] = arr[i ++ ];elsetemp[k ++ ] = arr[j ++ ]; }while (i <= mid) temp[k ++ ] = arr[i ++ ];while (j <= r) temp[k ++ ] = arr[j ++ ];for (i = l, j = 0; i <= r; i ++,j ++ ) arr[i] = temp[j];
}
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;
}
下面给出归并排序模板
void merge_sort(int *arr, int l, int r) {if (l >= r)return ;int mid = l + r >> 1;//确定分界点 (中间点) merge_sort(arr, l, mid);merge_sort(arr, mid+1, r); int k = 0, i = l, j = mid + 1; while (i <= mid && j <= r) {if (arr[i] <= arr[j]) temp[k ++ ] = arr[i ++ ];elsetemp[k ++ ] = arr[j ++ ]; }while (i <= mid) temp[k ++ ] = arr[i ++ ];while (j <= r) temp[k ++ ] = arr[j ++ ];for (i = l, j = 0; i <= r; i ++,j ++ ) arr[i] = temp[j];
}