二路归并排序

//============================================================================
// Name        : merge_sort.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================


#include <iostream>
#include<stdlib.h>
#include<stdio.h>
#include<time.h>


using namespace std;
void generate(int *p, int n) {
srand((int) time(0));
for (int i = 0; i < n; i++) {
*p++ = rand();
}


}


void output(int *p, int n) {
for (int i = 0; i < n; i++) {
printf("%d ", *p++);


}
printf("\n");
}
void merge(int *p, int low, int mid, int high) {
int *tmp = new int[high - low + 1];
int left = low, right = mid + 1, index = 0;
while (left <= mid && right <= high) {
if (p[left] <= p[right]) {
tmp[index++] = p[left++];


} else {
tmp[index++] = p[right++];
}
}


if (left <= mid) {
while (left <= mid) {
tmp[index++] = p[left++];
}
}


if (right <= high) {
while (right <= high) {
tmp[index++] = p[right++];
}
}
for(int i=0;i<index;i++) {
p[i+low] = tmp[i];
}
delete []tmp;


}
void merge_sort(int *p,int low,int high) {
if(low<high) {
int mid=(low+high)>>1;
merge_sort(p,low,mid);
merge_sort(p,mid+1,high);
merge(p,low,mid,high);
}
}
int main() {
int a[15];
generate(a, 15);
output(a, 15);
merge_sort(a,0,14);
output(a, 15);
return 0;

}

核心思想是分治和递归

T(n)=o(nlogn)

S(n)=o(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值