study归并排序

study归并排序,第1张

study归并排序

studyDay2
归并排序
①取整个数组的最中间点
②递归排序左边和右边
③将两个数组合并在一起
在中间点分成两个数列,用两个指针去指,先分别指出两个数列的最开始的地方,将指针向后边指
两个指针所指的数字进行比较,谁小就把他放在新的数组里面
时间复杂度O(n)
相关代码:
#include
using namespace std;
const int N=1000010;
int n;
int q[N],tmp[N]; //辅助数组
void merge_sort(int q[N], int l, int r)
{
if(l >=r) return;
int mid = (l+r) >> 1;//i和j分别指两边的指针
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]; //把两个序列变成一个

}
int main(){
scanf("%d", &n);
for (int i = 0; i < n;i ++) scanf("%d", &q[i]);
merge_sort(q, 0, n-1);
for (int i = 0; i < n;i ++) printf("%d ", q[i]);
return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5699446.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存