- 确定分界点,
- 递归排序
- 归并------合二为一
先把左边排好序,再把右边排好序,然两者合二为一
C++代码
#include <iostream>
using namespace std;
const int N = 1e5+10;
int n;
int q[N],temp[N];
void merge_sort(int q[],int l,int r){
if(l >= r) //如果数组只有一个元素或者没有元素,则直接退出
return;
int mid = l + r >> 1; //确定中点
merge_sort(q,l,mid); //递归排序左边和右边
merge_sort(q,mid+1,r);
int k = 0,i = l,j = mid + 1; //k记录temp数组走到哪了,i,j分别指向最左端和中间
while (i <= mid && j <= r){ //判断i,j是否小于左半边的边界和右半边的边界
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 = l, j = 0; i <= r; i++, j++ )
q[i] = temp[j];
}
int main(){
cin >> n;
for(int i = 0;i < n;i++)
cin >> q[i];
merge_sort(q,0,n-1); //0:数组的最左端,1数组的最右端
for(int i = 0;i < n;i++)
cout << q[i] << " ";
return 0;
}