码迷,mamicode.com
首页 > 编程语言 > 详细

归并排序C++实现

时间:2015-05-10 09:51:05      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

//归并排序
#include<iostream>
#include<functional>
#include<memory>
#include<array>


using namespace std;


void merge_sort(array<int,5>&, int);


int main()
{
array<int, 5> arr = { 1, 5, 2, 4, 3 };

merge_sort(arr, 5);
for (auto i : arr)
cout << i << endl;


cin.get();
return 0;
}


void merge_sort(array<int,5>& arr, int cont)
{
function<void(array<int,5>&, int, int, int)> Merge = [&](array<int,5>& arr_, int first, int mid, int last)
{
if (first >= last) //除非第一个和最后一个重合的时候才停止,因为只有两个的时候也需要排序
{
return;
}


Merge(arr_, first, mid / 2, mid); //递归使左半部分有序
Merge(arr_, mid + 1, (mid + 1 + last) / 2, last); //递归使右半部分有序

//必须把下面的代码放在下面,为了使最后能够处理原先整数组
unique_ptr<int[]> temp(new int[last+1]); //这里的last是实际下标,所以要加1
int f = first; //要把first保存一下,最后合并到原数组中时使用
int t = mid + 1; 
int k = 0;




   //直到有一部分全部比较完 注意:要包括最后一个元素
while (first <= mid && t <= last)
{
if (arr[first] < arr[t])
{
temp[k++] = arr[first++];
}
else
{
temp[k++] = arr[t++];
}
}


   //把剩余部分的东西处理完成
if (first > mid)  //这里其实可以省略掉if语句,直接写成两个while,但是为了代码的可读性,我们加上if语句
{
while (t <= last)
{
temp[k++] = arr[t++];
}
}
else
{
while (first <= mid)
{
temp[k++] = arr[first++];
}
}




        //把比较完成的两部分合起来放在原数组中
for (int i = 0; i < k; i++) 
{
arr[f + i] = temp[i];
}
};


Merge(arr, 0, (cont - 1) / 2, cont - 1);
}

归并排序C++实现

标签:

原文地址:http://blog.csdn.net/linukey/article/details/45605457

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!