#define SENTINEL_CARD (-1)
#include <vector>
#include <algorithm>
#include <iterator>
#include <functional>
#include <iterator>
template<
class bidirectional_iterator,
template <class> class less_equal_compare = std::less_equal
>
class merge_sort_functor
{
public:
void operator()(
bidirectional_iterator p,
bidirectional_iterator r)const
{
size_t diff = distance(p,r);
if(diff <=1)
return;
if(diff >0)
{
bidirectional_iterator q = p;
advance(q, diff/2);
this->operator ()(p, q);
this->operator ()(q, r);
merge(p, q, r);
}
}
private:
void merge( bidirectional_iterator first,
bidirectional_iterator middle,
bidirectional_iterator last)const
{
using namespace std;
typedef less_equal_compare<bidirectional_iterator::value_type> le;
le le_comparer;
size_t n1 = distance(first, middle);
size_t n2 = distance(middle, last);
std::vector<int> L(first,middle);
std::vector<int> R(middle,last);
L.push_back(SENTINEL_CARD);
R.push_back(SENTINEL_CARD);
std::vector<int>::iterator i=L.begin(), j=R.begin();
for(bidirectional_iterator k=first; distance(k,last)>=0; ++k)
{
if(*i == SENTINEL_CARD)
{
std::copy(j, --R.end(), k);
return;
}
if(*j == SENTINEL_CARD)
{
std::copy(i, --L.end(), k);
return;
}
if( le_comparer(*i,*j) )
*k = *i++;
else
*k = *j++;
}
}
};
测试程序
int b[]={345,67,56,6,4567467,65768,7686,34635,67,57678,235};
vector<int> vi(b,b+sizeof(b)/sizeof(int));
list<int> li(b,b+sizeof(b)/sizeof(int));
merge_sort(b, 0, sizeof(b)/sizeof(int));
merge_sort_functor<vector<int>::iterator, std::less_equal>()
(vi.begin(), vi.end());
merge_sort_functor<list<int>::iterator, std::greater>()
(li.begin(), li.end());
分享到:
相关推荐
在编程领域,排序算法是数据处理中的基础,它在各种应用中都发挥着重要作用。...而选择排序虽然在效率上不如快速排序或归并排序,但其简单的实现和固定的比较次数在某些特定场景下仍然具有一定的价值。
今天,我们将讨论几种常见的排序算法的实现,包括快速排序、冒泡排序、归并排序等。 快速排序 快速排序是一种高效的排序算法,它的时间复杂度为O(n log n)。快速排序的基本思想是选择一个轴元素,将数组分为两部分...
在本案例中,我们将利用面向对象的方法对单链表进行归并排序,这是一种高效的排序算法,尤其适用于大规模数据。归并排序采用分而治之的策略,将大问题分解为小问题,再逐个解决,最后合并结果。 1. **分而治之思想*...
总的来说,这个“希尔-归并排序——模板类”是一个很好的学习资源,特别是对于初学者,它展示了如何在实际编程中应用数据结构(如希尔排序和归并排序)以及如何使用模板类来实现泛型编程。通过理解并分析这个代码,...
- **归并排序(Merge Sort)**:归并排序也是一种分治算法,它将数组拆分为两个子数组,分别进行排序,然后合并这两个已排序的子数组以得到最终结果。这种方法保证了稳定的排序效果。 - **桶排序(Bucket Sort)*...
算法原理:本算法结合指针、模板、归并算法进行编写,可以高效地进行排序 。 这里提供了一个函数:Mergesort 通过给出数组的头、尾指针和自定义排序函数进行排序。 头指针:指指向数组首个元素的指针。 尾指针:指...
实际应用中,由于快速排序的常数因子较小,即使在最坏情况下也通常比其他O(nlog n)的排序算法如归并排序表现得更快。 值得注意的是,上述代码没有考虑优化措施,例如三数取中法选择枢轴,或者使用插入排序处理小...
这里我们主要关注的是几种常见的排序算法:快速排序、堆排序以及归并排序,这些都是在C++环境中实现的。下面我们将深入探讨这些排序算法的原理、优缺点以及实现细节。 **快速排序**: 快速排序是由英国计算机科学家...
归并排序 归并排序改进 归并排序自底向上 快速排序 随机化快速排序 双路快速排序 三路快速排序 堆和堆排序 堆的基本存储 ShiftUp ShiftDown 基础堆排序和Heapify 优化的堆排序 索引堆(IndexHeap) 索引堆的优化 二分...
归并排序的时间复杂度始终为O(n log n),是一种非常高效的排序算法,但需要额外的空间,因此在内存有限的情况下可能不适用。归并排序是稳定的排序方法。 4. 基数排序: 基数排序是一种非比较型排序算法,根据数字的...
这个包可能包含了多种经典的排序算法,如冒泡排序、插入排序、选择排序、快速排序、归并排序和堆排序等。其中: 1. 冒泡排序:通过不断交换相邻的逆序元素来逐步排序,时间复杂度为O(n^2)。 2. 插入排序:将每个...
例如,可以添加一个 `sort()` 方法对链表进行排序,使用诸如快速排序、归并排序等算法。由于 `T` 实现了 `Comparable<T>`,我们可以直接使用 Java 内置的排序方法,或者自定义比较逻辑。 总之,Java泛型单链表提供...
为了进一步提升排序性能,还可以考虑使用更高效的排序算法,如快速排序、归并排序或者堆排序,但这些对于只有三个元素的排序可能显得过于复杂。对于初学者来说,理解并实现ABC排序这样的简单例子,有助于建立基本的...
1、插入排序(InsertSort) 2、冒泡排序(BubbleSort) 3、选择排序(SelectSort) 4、快速排序(QuickSort) 5、希尔排序(ShellSort) ...8、归并排序(MergeSort) 9、基数排序(RadixSort)
然后,通过继承这个基类或实现相关的接口,如`Comparator`,可以创建不同的排序策略,如快速排序、归并排序、冒泡排序等。 【继承接口】是Java中实现多态性和扩展功能的关键手段。在这个排序包中,可能定义了一个或...
本文将深入探讨五种经典的排序算法:归并排序、基数排序、快速排序、谢尔排序,并结合C++编程语言来理解它们的工作原理。 1. **归并排序**: 归并排序是一种基于分治策略的排序算法。它将大问题分解为小问题,然后...
高级排序算法如快速排序、归并排序等,它们的时间复杂度通常优于O(n^2),其中快速排序平均情况下的时间复杂度为O(n log n),在最坏情况下也能保持在O(n^2)。而归并排序则始终稳定在O(n log n)。 除了这些常见的排序...
归并排序是分治法的典型应用,将大数组分解为小数组,分别进行排序,然后合并这些已排序的小数组。这种方法保证了稳定性,但需要额外的存储空间。 8. **计数排序 (Counting Sort)** 计数排序不是基于比较的排序...
- **排序和查找算法**:包括快速排序、归并排序、二分查找等,这些算法都是泛型化的,可以应用于任何支持比较操作的类型。 3. **类型安全:** DGL的一个重要优点就是类型安全。在编译时,泛型确保了只有兼容的...
- **归并排序**:归并排序利用了分治的思想,将数组分成两半,分别排序,然后合并两个已排序的子数组。它的时间复杂度始终为O(n log n),但需要额外的存储空间,因此在内存有限的情况下可能不是最佳选择。 此外,...