本文已参与「新人创作礼」活动,一起开启掘金创作之路。
算法思想:分治 时间复杂度:O(nlogn)
第一步:选取中点,将一段要排序的数字分为两段,然后分别对两段排序(因为分治,所以可以保证这两段都是有序的)
第二步:用两个指针分别扫描这两段,每次把最小的一个数放入一个临时数组里,直到某一段放完,然后把剩下一段全部放入临时数组即可
第三步:把临时数组里的数放到原数组里
void merge_sort(int q[],int l,int r)
{
if(l>=r) return;
int mid = l+r >>1; //二进制右移一位 相当于(l+r)/2
merge_sort(q,l,mid),merge_sort(q,mid+1,r);
int k = 0, i = l, j = mid+1;
while(i <= mid && j <= r)
if(q[i] <= q[j]) tmp[ k++ ] = q[ i ++ ];
else tmp[ k ++ ] = q[ j ++ ];
while(i <= mid) tmp[ k ++ ] = q[ i ++ ];
while(j <= r) tmp[ k ++ ] = q[ j ++ ];
for(i = l, j = 0; i <= r;i ++, j ++) q[i] = tmp[j];
}