【笔记】 sort的用法

来源:互联网 发布:sql 标识符无效 编辑:程序博客网 时间:2024/05/17 08:33

从别人哪里转载来的

网址是

http://bbs.ecust.edu.cn/archiver/?tid-14302.html

因为在学,怕忘了,算作是笔记吧

sort的用法

按照给定的方案给区间中的元素排序。
加载头文件#include<algorithm>
函数原型:
template<class RandomAccessIterator>
void sort (RandomAccessIterator _First, RandomAccessIterator _Last);

template<class RandomAccessIterator, class BinaryPredicate>
void sort (RandomAccessIterator _First, RandomAccessIterator _Last, BinaryPredicate _Comp);
传入参数说明:
_First                要排序区间的起始位置
_Last                要排序区间的结束位置
_Comp                自定义的表示顺序关系的函数对象。
说明:
要排序区间必须是合法的,并且所有元素是可提领的。区间中的元素必须是在有限步内可达的。
该算法不是稳定的,不保持元素的相对先后顺序。
该算法的平均的时间复杂性为O(N long N),中 N = _Last-_First
演示sort的功能及使用方法;
[code]
#include <algorithm>
#include <iostream>

using namespace std;

#define N 5

struct Node
{
   int elem1;
   int elem2;
};

bool mycmp(const Node & a, const Node & b)
//貌似这里定义的关系必须是一个(良序X)的关系……否则sort将不能正常工作。
{
   return a.elem1<b.elem1;
}

int main()
{
   Node node[N];
   for(int i=0;i<N;++i)
   {
      node[i].elem1=N-i;
      node[i].elem2=i;
   }
   sort(node, node+N, mycmp);
   //使用mycmp对结构体数组以第一个元素排序,排序后结构体数组以第一元素从小到大排列

   return 0;
}
[/code]

[[i] 本帖最后由 Jonas 于 2006-8-12 14:44 编辑 [/i]]


 

2006-8-11 23:29 ddotcdot
良序关系的说法是不准确的,因为良序关系是一种全序关系,这恰恰是不正确的。

准确的说法是严格弱序关系(strict weak ordering),满足非自反性(irreflexive),反对称性(antisymmetric),传递性(transitive)以及等价传递性(transitivity of equivalence)。其中前三条定义的是严格偏序关系(strict partial ordering)。良序关系虽然是偏序关系,但不是严格偏序关系,因为其不满足非自反性,因此不是严格弱序关系。

设x,y为集合S中的元素,R为S上的严格弱序关系,则当x R y和y R x都不满足时,x与y等价。例如实数集上的<关系和>关系都是严格弱序的,而<=和>=就不是。因为如a<b<d,a<c<d且没有其他元素或关系存在时,可知b与c等价,而a<=b<=d,a<=c<=d且没有其他元素或关系存在的情况下,并不能推出b与c等价。

当然实际使用的时候并不需要考虑那么多。只需要知道,因为是“严格”的,所以只有像<这样的关系,而没有像<=这样的关系。换句话讲,如果你要定义<的关系,则你的谓词只有在<的情况下才能返回true,其他情况(如=和>)下一律要返回false。在sort中使用非严格弱序关系的后果是不确定的,根据编译器实现的不同,可能会正常工作,也可能会引起未定义的行为,导致死循环或非法操作。这是初学者通常会犯的错误(我当年就犯过:()。

原创粉丝点击