归并排序

O(nlgn)时间

需要额外空间,在n比较大时比插入排序O(n*n)时间要快

快速排序是直接的原址排序,所费时间同是O(nlgn)


先把代码贴进来,有相关注释


/******************
归并排序
O(nlgn)时间
create by tianlanli

2016/6/16
*******************/


#include<iostream>
#include<vector>


using namespace std;


void merge(vector<int>&,int p,int q,int r);//注意vector数组为引用
void merge_sort(vector<int>&a,int p,int r);


int main(void)
{
vector<int>nums;
int value;
while(cin>>value)
nums.push_back(value);
cout<<"origin    "<<endl;
for(int i = 0;i != nums.size();++i)
cout<<nums[i]<<"   ";
cout<<endl;


merge_sort(nums,0,nums.size() - 1);//归并排序调用

cout<<"after sorted   "<<endl;
for(int i = 0;i != nums.size();++i)
cout<<nums[i]<<"  ";
cout<<endl;
return 0;
}


void merge_sort(vector<int>&vec,int p,int r)
{
//如果p >= r 循环退出
if(p < r){
//用二分法进行再次划分
int q = (p + r) / 2;
merge_sort(vec,p,q);//注意此处有q - p + 1个数据
merge_sort(vec,q + 1,r);
merge(vec,p,q,r);//将划分的数组进行组合
}
}


void merge(vector<int>&vec,int p,int q,int r)
{
//m,n代表各有多少个数据
int m = q - p + 1,n = r - q;
vector<int>left(m,0),right(n,0);//分配数组将vec中的数据分别拷贝到left、right数组中
for(int i = 0;i != m;++i)
left[i] = vec[p + i];//注意此处的p + i,不仅仅是i
for(int j = 0;j != n;++j)
right[j] = vec[q + j + 1];//同理此处的q + j + 1,而不是j
int i = 0,j = 0,k = 0;
while(i < m && j < n){//因为是i= j = 0出开始,所以为小于
if(left[i] < right[j])
vec[p + k++] = left[i++];
else vec[p + k++] = right[j++];
}
while(i < m)//如果left中数据没排完,则直接将left中数据拷贝进数组即可
vec[p + k++] = left[i++];
while(j  < n)//同理
vec[p + k++] = right[j++];
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值