算法:归并排序
归并排序----分治
时间复杂度:O(n) = nlogn
稳定性:稳定的排序算法
步骤:
第一步:确定分界点:mid = (l + r) / 2
第二步:归并排序left,right
第三步:归并合二为一
代码:
#include<iostream>
using namespace std;
int a[100010];
int n;
int temp[100010];
void merge_sort(int l, int r){
if(l >= r){
return;
}
int mid = (l + r) >> 1;
merge_sort(l, mid);
merge_sort(mid + 1, r);
int j = mid + 1;
int i = l;
int k = 0;
while(i <= mid && j <= r){
if(a[i] <= a[j]) temp[k++] = a[i++];
else temp[k++] = a[j++];
}
while(i <= mid) temp[k++] = a[i++];
while(j <= r) temp[k++] = a[j++];
for(int i = l, j = 0; i <= r; ++i, ++j) a[i] = temp[j];
}
int main()
{
cin >> n;
for(int i = 0; i < n; ++i){
scanf("%d", &a[i]);
}
merge_sort(0, n-1);
for(int i = 0; i < n; ++i){
printf("%d ", a[i]);
}
return 0;
}
注意:
将temp中的值放回原数组中时,需要利用i,j两个变量进行,因为i从l到r,j从0开始。这样就能将原数组中的l到r排好序。