algorithm库介绍之---- stable_sort()方法 与 sort()方法 .

文章转载自:http://www.cnblogs.com/ffhajbq/archive/2012/07/24/2607476.html

关于stable_sort()和sort()的区别:

你发现有sort和stable_sort,还有 partition 和stable_partition, 感到奇怪吧。其中的区别是,带有stable的函数可保证相等元素的原本相对次序在排序后保持不变。或许你会问,既然相等,你还管他相对位置呢,也分不清 楚谁是谁了?这里需要弄清楚一个问题,这里的相等,是指你提供的函数表示两个元素相等,并不一定是一摸一样的元素。

例如,如果你写一个比较函数:

bool less_len(const string &str1, const string &str2)
{
        return str1.length() < str2.length();
}

此时,"apple" 和 "winter" 就是相等的,如果在"apple" 出现在"winter"前面,用带stable的函数排序后,他们的次序一定不变,如果你使用的是不带"stable"的函数排序,那么排序完 后,"Winter"有可能在"apple"的前面。

举例说明:

#include <vector>
 #include <iostream>
 #include <algorithm>

 using namespace std;

 bool comp_as_int(double i, double j)
 {
     return (int(i)<int(j));
 }

 int main()
 {
     double mydoubles[] = {3.14, 1.41, 2.72, 4.67, 1.73, 1.32, 1.62, 2.58};
     vector<double> v;
     vector<double>::iterator it;

     v.assign(mydoubles, mydoubles + 8);

     cout<<"use default comparison:"<<endl;
     stable_sort(v.begin(), v.end());

     for(it = v.begin(); it != v.end(); it++)
         cout<<*it<<" ";
     cout<<endl;

     cout<<"use selfdefined comparison function comp_as_int():"<<endl;
     v.assign(mydoubles, mydoubles + 8);
     stable_sort(v.begin(), v.end(), comp_as_int);

     for(it = v.begin(); it != v.end(); it++)
         cout<<*it<<" ";
     cout<<endl;
     cout<<"if it is not sorted with stable_sort(), the sequence of all elements between 1 and 2 will be set randomly..."<<endl;

     return 0;
 }

输出结果:

1 use default comparison:
2 1.32 1.41 1.62 1.73 2.58 2.72 3.14 4.67
3 use selfdefined comparison function comp_as_int():
4 1.41 1.73 1.32 1.62 2.72 2.58 3.14 4.67
5 if it is not sorted with stable_sort(), the sequence of all elements between 1 and 2 will be set randomly...
时间: 2024-12-17 05:45:01

algorithm库介绍之---- stable_sort()方法 与 sort()方法 .的相关文章

定制对ArrayList的sort方法的自定义排序

java中的ArrayList需要通过collections类的sort方法来进行排序 如果想自定义排序方式则需要有类来实现Comparator接口并重写compare方法 调用sort方法时将ArrayList对象与实现Commparator接口的类的对象作为参数 示例: // 外部类的方式 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.uti

深入了解javascript的sort方法

在javascript中,数组对象有一个有趣的方法 sort,它接收一个类型为函数的参数作为排序的依据.这意味着开发者只需要关注如何比较两个值的大小,而不用管"排序"这件事内部是如何实现的.不过了解一下sort的内部实现也不是一件坏事,何不深入了解一下呢? 算法课上,我们会接触很多种排序算法,什么冒泡排序.选择排序.快速排序.堆排序等等.那么javascript的 sort方法采用哪种排序算法呢?要搞清楚这个问题,呃,直接看v8源代码好了.v8中对 Array.sort的实现是采用ja

Java中自定义对象使用Collections工具类中的Sort方法

Collections工具类中的sort方法有两种形式: (1) sort(List<T> list) (2) sort(List<T> list, Comparator<? super T> c) 第一种方法中List类型的对象必须实现Comparable接口,此外,List中的元素必须可比较. 我们先定义类 package com.dongye.sort; import java.util.ArrayList; import java.util.Collection

python 常库介绍及安装方法

文大赛,秀绝招,赢无人机! python 常库介绍及安装方法 标签: PYTHON库 2016-10-13 15:32 798人阅读 评论(0) 收藏 举报  分类: 其他(33)  bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheetahcherrypy:一个WEB frameworkctypes:用来调用动态链接库DBUtils:数据库连接池django:一个WEB frameworkdocutils:用来写文档的dpkt:数据包的解包和组包My

Java中双基准快速排序方法(DualPivotQuicksort.sort())的具体实现

在Java语言的Arrays类下提供了一系列排序(sort)方法,帮助使用者对各种不同数据类型的数组进行排序. 在1.7之后的版本中, Arrays.sort()方法在操作过程中实际调用的是DualPivotQuicksort类下的sort方法,DualPivotQuicksort和Arrays一样,都在java.util包下,按字面翻译过来,就是双(Dual)基准(Pivot)快速排序(Quicksort)算法. 双基准快速排序算法于2009年由Vladimir Yaroslavskiy提出,

结合Scikit-learn介绍几种常用的特征选择方法

作者:Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减少特征数量.降维,使模型泛化能力更强,减少过拟合 增强对特征和特征值之间的理解 拿到数据集,一个特征选择方法,往往很难同时完成这两个目的.通常情况下,我们经常不管三七二十一,选择一种自己最熟悉或者最方便的特征选择方法(往往目的是降维,而忽略了对特征和数据理解的目的).

干货:结合Scikit-learn介绍几种常用的特征选择方法

原文  http://dataunion.org/14072.html 主题 特征选择 scikit-learn 作者: Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减少特征数量.降维,使模型泛化能力更强,减少过拟合 增强对特征和特征值之间的理解 拿到数据集,一个特征选择方法,往往很难同时完成这两个目的.通常情况下,我

Alljoyn瘦客户端库介绍(官方文档翻译)

Alljoyn瘦客户端库介绍(1) 1.简介 本文档对AllJoynTM瘦客户端的核心库文件(AJTCL)进行了详尽的介绍.本文档介绍了系统整体架构,AllJoyn框架结构,并着重于介绍如何将嵌入式设备加入AllJoyn系统整体架构中.1.1目的 本文档介绍了如何使一个受限于功耗.计算能力和内存的设备(嵌入式设备)加入AllJoyn分布式系统.具体而言,本文档包括了对AllJoyn面向嵌入式系统的方面的介绍,并着重描述了基于AllJoyn的系统的各个组件是如何与嵌入式设备协作以构建一个基于接近式

走进C++程序世界------IO标准库介绍

流概述 流是C++标准的组成部分,流的主要目标是,将从磁盘读取文件或将输入写入控制台屏幕的问题封装起来,创建流后程序员就可以使用它,流将负责处理所有的细节. IO类库 在C++输入?输出操作是通过C++系统提供的完成I/O操作的一组类实现的.主要包括: 标准流类:处理与标准输入设备(键盘)和输出设备(显示器)关联的数据流 文件流类:处理与磁盘文件关联的数据流 字符串流类:利用内存中的字符数组处理数据的输入输出 异常类等:处理异常错误. 标准IO对象: 包含iostream类的C++程序启动时,将