c++sort()函数的用法

c++sort()函数的用法
c++sort()函数的用法

C++sort()函数的用法

近来看了c++标准库这本书,学到了很多,就把这其中的一点C++sort()函数的用法写下来和大家分享吧!

(一)为什么要用c++标准库里的排序函数

Sort()函数是c++一种排序方法之一,学会了这种方法也打消我学习c++以来使用的冒泡排序和选择排序所带来的执行效率不高的问题!因为它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n),执行效率较高!

(二)c++标准库里的排序函数的使用方法

I)Sort函数包含在头文件为#include的c++标准库中,调用标准库里的排序方法可以不必知道其内部是如何实现的,只要出现我们想要的结果即可!

II)Sort函数有三个参数:

(1)第一个是要排序的数组的起始地址。

(2)第二个是结束的地址(最后一位要排序的地址)

(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。Sort函数使用模板:

Sort(start,end,,排序方法)

下面就具体使用sort()函数结合对数组里的十个数进行排序做一个说明!

例一:sort函数没有第三个参数,实现的是从小到大

#include

#include

using namespace std;

int main()

{

int a[10]={9,6,3,8,5,2,7,4,1,0};

for(int i=0;i<10;i++)

cout<

sort(a,a+10);

for(int i=0;i<10;i++)

cout<

return 0;

}

例二

通过上面的例子,会产生疑问:要实现从大到小的排序肿么办?

这就如前文所说需要在sort()函数里的第三个参数里做文章了,告诉程序我要从大到小排序!

需要加入一个比较函数complare(),此函数的实现过程是这样的

bool complare(int a,int b)

{

return a>b;

}

这就是告诉程序要实现从大到小的排序的方法!

#include

#include

using namespace std;

bool complare(int a,int b)

{

return a>b;

}

int main()

{

int a[10]={9,6,3,8,5,2,7,4,1,0};

for(int i=0;i<10;i++)

cout<

sort(a,a+10,complare);//在这里就不需要对complare函数传入参数了,//这是规则

for(int i=0;i<10;i++)

cout<

return 0;

}

例三:

通过上面例一、二的方法虽然实现了从大到小和从大到小的排序,这样做还是有点麻烦,因为还需要自己编写告诉程序进行何种排序的函

数,c++标准库强大的功能完全可以解决这种麻烦。

Sort函数的第三个参数可以用这样的语句告诉程序你所采用的排序原则

less<数据类型>()//从小到大排序

greater<数据类型>()//从大到小排序

结合本例子,这样的就可以完成你想要的任何一种排序原则了

#include

#include

using namespace std;

int main()

{

int a[10]={9,6,3,8,5,2,7,4,1,0}; for(int i=0;i<10;i++)

cout<

sort(a,a+10,less());

for(int i=0;i<10;i++)

cout<

return 0;

} #include

#include

using namespace std;

int main()

{

int a[10]={9,6,3,8,5,2,7,4,1,0}; for(int i=0;i<10;i++)

cout<

sort(a,a+10,greater()); for(int i=0;i<10;i++)

cout<

return 0;

}

例四:利用sort函数还可以实现对字符的排序,排序方法大同小异,

下面就把程序范例展示一下#include

#include

using namespace std;

int main()

{

char a[11]="asdfghjklk";

for(int i=0;i<10;i++)

cout<

sort(a,a+10,greater()); for(int i=0;i<10;i++)

cout<

return 0;

}

sort和qsort函数对结构体的二级排序

qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有多个重复值 的数组来说,基本快速排序的效率较低,且不稳定)。集成在C语言库函数里面的的qsort函数, 使用三路划分的方法解决排序这个问题。所谓三路划分,是指把数组划分成小于划分值,等于 划分值和大于划分值的三个部分。 具体介绍:-^^ void qsort( void *base, size_t num, size_t width, int (__cdecl *compare ) int compare (const void *elem1, const void *elem2 ) ); qsort(即,quicksort)主要根据你给的比较条件给一个快速排序,主要是通过指针移动实现排序 功能。排序之后的结果仍然放在原来数组中。 参数意义如下: 第一个参数 base 是需要排序的目标数组名(或者也可以理解成开始排序的地址,因为可以写 &s[i]这样的表达式) 第二个参数 num 是参与排序的目标数组元素个数 第三个参数 width 是单个元素的大小(或者目标数组中每一个元素长度),推荐使用sizeof(s[0]) 这样的表达式 第四个参数 compare 就是让很多人觉得非常困惑的比较函数啦。 我们来简单讨论compare这个比较函数(写成compare是我的个人喜好,你可以随便写成什么,比如 cmp 什么的,在后面我会一直用cmp做解释)。 典型的compare的定义是int compare(const void *a,const void *b); 返回值必须是int,两个参数的类型必须都是const void *,那个a,b是随便写的,个人喜好。假 设是对int排序的话,如果是升序,那么就是如果a比b大返回一个正值,小则负值,相等返回0,其他的依次类推,后面有例子来说明对不同的类型如何进行排序。

sort 函数用法简介

STL中sort函数用法简介 使用这个函数,需要包含头文件#include 。 这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b)。简单来说,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了,默认的排序方式是升序。 对向量v排序也差不多,sort(v.begin(),v.end()); 排序的数据类型不局限于整数,只要是定义了小于运算的类型都可以,比如字符串类string。如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。比较函数是一个自己定义的函数,返回值是bool型,它规定了什么样的关系才是“小于”。想把刚才的整数数组按降序排列,可以先定义一个比较函数cmp bool cmp(int a,int b) { return a>b; } 排序的时候就写sort(a,a+100,cmp); 假设自己定义了一个结构体node struct node{ int a; int b; double c; } 有一个node类型的数组node arr[100],想对它进行排序:先按a值升序排列,如果a 值相同,再按b值降序排列,如果b还相同,就按c降序排列。就可以写这样一个比较函数: 以下是代码片段: bool cmp(node x,node y) { if(x.a!=y.a) return x.a if(x.b!=y.b) return x.b>y.b;

return return x.c>y.c; } 排序时写sort(arr,a+100,cmp); 最后看一个完整的实例,初赛时的一道题目“文件名排序”。 以下是代码片段: #include #include #include using namespace std; //定义一个结构体来表示文件,a代表文件名,b代表文件类型(要么"File"要么"Dir")struct node{ string a,b; }; //ASCII码中,所有大写字母排在所有小写字母前面,'A'<'Z'<'a'<'z' //而这题要求忽略大小写,所以不能直接用字符串的比较。自定义了一个lt函数,就是less than的意思 //先把两个字符串全部转化为小写,再比较大小(字典序) bool lt(string x,string y) { int i; for(i=0;i='A'&&x[i]<='Z') x[i]='a'+(x[i]-'A'); for(i=0;i='A'&&y[i]<='Z') y[i]='a'+(y[i]-'A'); return x

STRING类函数用法总结3

C++中的string类 前言:string的角色 1string使用 1.1充分使用string操作符 1.2眼花缭乱的string find函数 1.3string insert,replace,erase2string和C风格字符串 3string和Charactor Traits 4string建议 5小结 6附录前言:string的角色 C++语言是个十分优秀的语言,但优秀并不表示完美。还是有许多人不愿意使用C或者C++,为什么?原因众多,其中之一就是C/C++的文本处理功能太麻烦,用起来很不方便。以前没有接触过其他语言时,每当别人这么说,我总是不屑一顾,认为他们根本就没有领会C++的精华,或者不太懂C++,现在我接触perl,php,和Shell脚本以后,开始理解了以前为什么有人说C++文本处理不方便了。 举例来说,如果文本格式是:用户名电话号码,文件名name.txt Tom23245332 Jenny22231231 Heny22183942 Tom23245332 ... 现在我们需要对用户名排序,且只输出不同的姓名。 那么在shell编程中,可以这样用: awk'{print$1}'name.txt|sort|uniq 简单吧? 如果使用C/C++就麻烦了,他需要做以下工作: 先打开文件,检测文件是否打开,如果失败,则退出。 声明一个足够大得二维字符数组或者一个字符指针数组 读入一行到字符空间 然后分析一行的结构,找到空格,存入字符数组中。 关闭文件 写一个排序函数,或者使用写一个比较函数,使用qsort排序 遍历数组,比较是否有相同的,如果有,则要删除,copy... 输出信息 你可以用C++或者C语言去实现这个流程。如果一个人的主要工作就是处理这种

53.String sort 字符串排序的几种方法

String sort的几种方法 简介 在之前的一些排序算法中,主要是对一些数值的类型比较的比较多一点。而对于字符串类型来说,它有一些特殊的性质。如果按照传统的排序方法,对于字符串的比较性能其实还取决于字符串的长度以及相似程度。实际上,对于一些字符集的取值在一个比较小的范围内的情况,我们可以有一些比较高效率的算法。这里针对这些特殊的情况进行讨论。 假设给定的排序集合里元素,也就是每个字符都是在一个比较有限的范围里,比如说256个字符范围内。那么,我们可以利用这个特性做一些高效的处理。联想到之前讨论过的counting sort和radix sort方法。这里就是利用了这个特性。 Key-Indexed counting 在之前讨论couting sort的文章里,曾经针对需要排序的元素为数字的情况进行过讨论。counting sort成立的一个前提是它里面所有的元素取值是在一个固定的范围内。假设这个数组里元素能取的最大值是k,那么每次我们要排序的时候只需要声明一个长度为k的数组a。每次碰到一个元素i就将a[i]对应的值加1。这样就统计出来了所有从小到大的元素的值的分布。剩下的就只是从小到达把这些值重新排列输出就可以了。 当然,在一些数字有一定长度而且它们的长度都一样的情况下。我们可以利用从高到低或者从低到高位逐位排序的方式来对数组进行排序。这就是radix sort的基本思路。它本质上就是在每一位的排序上都使用了couting sort。 借鉴前面对于数字的排序,我们对于字符串数组的排序也可以采用类似的方式: Java代码 1.int[] count = new int[R + 1]; 2.//计算每个字符出现的频率 3.for(int i = 0; i < n; i++) 4. count[a[i].charAt(d) + 1]++; 5.//将每个字符出现的频率转换为所在的索引 6.for(int r = 0; r < R; r++) 7. count[r + 1] += count[r]; 8.//将字符分布到具体的数组位置 9.for(int i = 0; i < n; i++) 10. aux[count[a[i].charAt(d)]++] = a[i]; 11.//将结果拷贝回数组 12.for(int i = 0; i < n; i++) 13. a[i] = aux[i]; 上述代码里的R表示当前字符的取值范围。在R值不大的时候它的效率还是相当可观的。在这个计数排序的基础上,我们可以得到一些不同的排序算法。 LSD sort 一种最典型的方法就是从最低位向最高位的方式依次排序,这种和前面的radix sort的思路基本上完全一样。不过在前面的基础上针对字符的情况稍微做一点修改。详细的代码实现如下: Java代码 1.public class LSD {

c++sort

sort()函数是C++中的排序函数其头文件为:#include头文件;qsort()是C中的排序函数,其头文件为:#include 1、sort() sort 对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 partial_sort 对给定区间所有元素部分排序 partial_sort_copy 对给定区间复制并排序 nth_element 找出给定区间的某个位置对应的元素 is_sorted 判断一个区间是否已经排好序 partition 使得符合某个条件的元素放在前面 stable_partition 相对稳定的使得符合某个条件的元素放在前面 语法描述为: (1)sort(begin,end),表示一个范围,例如: #include "stdafx.h" #include #include using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int a[10]={2,4,1,23,5,76,0,43,24,65},i; for(i=0;i<10;i++) cout<

输出结果将是把数组a按升序排序,说到这里可能就有人会问怎么样用它降序排列呢?这就是下一个讨论的内容。 (2)sort(begin,end,compare) 一种是自己编写一个比较函数来实现,接着调用三个参数的sort: sort(begin,end,compare)就成了。 对于list容器,这个方法也适用,把compare作为sort的参数就可以了,即:sort(compare)。 1)自己编写compare函数: bool compare(int a,int b) { return ab” } int _tmain(int argc, _TCHAR* argv[]) { int a[10]={2,4,1,23,5,76,0,43,24,65},i; for(i=0;i<10;i++) cout<

kind与sort 的区别和用法(a ~ of, this ~ of, many kinds of )

a kind of, this kind of, many kinds of 和 a sort of区别和用法 kind作名词用时,表示种类,比较下面的结构: a kind of +单数名词(不加冠词)一种 this kind of +单数名词(不加冠词)这种 many kinds of +单数名词丨复数名词(不加冠词) 许多种 different kinds of +单数名词丨复数名词(不加冠词) 不同种类 these kinds of +单数名词丨复数名词(不加冠词) 这些种类 all kinds of 单数名词丨复数名词(不加冠词) 各种 This is a new kind of pen.(正)这是一种新型钢笔。 This is a new kind of pens.(误) I like that kind of apple.(正)我喜欢那种苹果 I like that kind of an apple.(误) He saw many kinds of machine.(正)他见到了许多种机器。 He saw many kinds of machines.(正) He wants to buy different kinds of stamp.(正)他想买不同种类的邮票。He wants to buy different kinds of stamps.(正)

She lent me three kinds of book.(正)她借给我三种书。 She lent me three kinds of books.(正) He has read all kinds of story-book.(正)他读过各种各样的故事书。 He has read all kinds of story-books. 正) 【比较】 This kind of book is worth reading.这种书值得读。(一种〉 These kinds of books are worth reading.这些种类的书值得读。(多种) What kind of bookis it?它是什么种类的书? What kind of books are these?这些是什么种类的书?(注意,在what kind lof结构中,kind —般不加s) ■ many kinds of, different kinds of, these kinds of 和 all kinds of 修饰名词作主语时,谓语动词要用复数形式。、 Many kinds of shoes are on show in the shop.商店里展出了许多种类的鞋。 There are all kinds of trees along the lake.沿湖有各种各样的树。 a kind of+名词结构中,形容词通常修饰kind,修饰名词的情况偶尔也有, 但不自然。

STL中sort函数用法简介

STL中sort函数用法简介 做ACM题的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。STL里面有个sort函数,可以直接对数组排序,复杂度为n*log2(n)。使用这个函数,需要包含头文件。 这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b)。简单来说,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了,默认的排序方式是升序。 拿我出的“AC的策略”这题来说,需要对数组t的第0到len-1的元素排序,就写sort(t,t+len); 对向量v排序也差不多,sort(v.begin(),v.end()); 排序的数据类型不局限于整数,只要是定义了小于运算的类型都可以,比如字符串类string。 如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。比较函数是一个自己定义的函数,返回值是bool型,它规定了什么样的关系才是“小于”。想把刚才的整数数组按降序排列,可以先定义一个比较函数cmp bool cmp(int a,int b) { return a>b; } 排序的时候就写sort(a,a+100,cmp); 假设自己定义了一个结构体node struct node{ int a; int b; double c; } 有一个node类型的数组node arr[100],想对它进行排序:先按a值升序排列,如果a值相同,再按b值降序排列,如果b还相同,就按c降序排列。就可以写这样一个比较函数: 以下是代码片段: bool cmp(node x,node y) { if(x.a!=y.a) return x.a if(x.b!=y.b) return x.b>y.b; return return x.c>y.c; } 排序时写sort(arr,a+100,cmp); 最后看一个完整的实例,初赛时的一道题目“文件名排序”。 以下是代码片段: #include #include #include using namespace std; //定义一个结构体来表示文件,a代表文件名,b代表文件类型(要么"File"要么"Dir") struct node{ string a,b; }; //ASCII码中,所有大写字母排在所有小写字母前面,'A'<'Z'<'a'<'z' //而这题要求忽略大小写,博彩评级https://www.360docs.net/doc/601148959.html, 所以不能直接用字符串的比较。自定义了一个lt函数,就是less than的意思 //先把两个字符串全部转化为小写,再比较大小(字典序)

Linux操作系统中排序命令Sort的使用方法

语法格式 sort [ -A ] [ -b ] [ -c ] [ -d ] [ -f ] [ -i ] [ -m] [ -n ] [ -r ] [ -u ] [ -o OutFile ] [ -t Character ] [ -T Dir ectory ] [ -y [ Kilobytes ] ] [ -z RecordSize ] [ [ [ FSkip ] [ .CSkip ] [ b ] [ d ] [ f ] [ i ] [ n ] [ r ] ] [ - [ FSkip ] [ .CSkip ] [ b ] [ d ] [ f ] [ i ] [ n ] [ r ] ] ] [ -k KeyDefinition ] [文件 ] 使用说明 sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出。如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序。-(减号)代替文件名指定标准输入。如果您不指定任何文件名,那么该命令对标准输入排序。可以使用 -o 标志指定输出文件。 如果不指定任何标志,sort 命令基于当前语言环境的整理顺序对输入文件的所有行排序。主要参数 -A 使用 ASCII 整理顺序代替当前语言环境的整理顺序在逐字节的基础上排序。 -b 忽略前导空格和制表符,找出字段的第一或最后列。 -c 检查输入是否已按照标志中指定的排序规则进行排序。如果输入文件排序不正确,就返回一个非零值。 -d 使用字典顺序排序。比较中仅考虑字母、数字和空格。 -f 比较前将所有小写字母改成大写字母。 -i 比较中忽略所有非显示字符。 -k KeyDefinition 指定排序关键字。KeyDefinition 选项的格式为: [ FStart [ .CStart ] ] [ ModifIEr ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]排序关键字包括所有以 FStart 变量指定的字段和 CStart 变量指定的列开头的字符及以 FEnd 变量指定的字段和 CEnd 变量指定的列结束的字符。Modifier 变量的值可以是 b、d、f、i、n 或 r。修饰符与同一字母的标志等价。-m 只合并多个输入文件;假设输入文件已经排序。 -n 按算术值对数字字段排序。数字字段可包含前导空格、可选减号、十进制数字、千分位分隔符和可选基数符。对包含任何非数字字符的字段进行数字排序会出现无法预知的结果。 -o OutFile 将输出指向 OutFile 参数指定的文件,而不是标准输出。OutFile 参数值可以与 File 参数值相同。 -r 颠倒指定排序的顺序。 -t Character 指定 Character 为单一的字段分隔符。 -u 禁止按照排序关键字和选项的所有等同排序(每一组行中一行除外)。 -T Directory 将创建的所有临时文件放入 Directory 参数指定的目录中。 -y[Kilobytes] 用 Kilobytes 参数指定的主存储的千字节数启动 sort 命令,并根据需要增加存储量。(如果 Kilobytes 参数指定的值小于最小存储站点或大于最大存储站点,就以这个最小存储站点或最大存储站点取代)。如果省略 -y 标志,sort 命令以缺省的存储大小启动。-y0 标志用最小存储启动,而 -y 标志(不带 Kilobytes 值)用最大存储启动。sort 命令使用的存储量显著地影响性能。以大存储量对小文件排序将很浪费。 -z RecordSize 如果正在排序的任一行大于缺省的缓冲区大小,要防止出现异常终止。指定 -c 或 -m 标志时,省略排序阶段,使用系统的缺省缓冲大小。如果已排序行超出这一大小,排序异常终止。-z 选项指定排序阶段最长行的记录,因而可在合并阶段分配足够的缓冲区。RecordSize 必须指明等于或大于要合并的最长行的字节值。

C语言标准库函数

标准库函数 本附录描述了标准C支持的库函数①。使用此附录时,请记住下列要点。 为了简洁清楚,这里删除了一些细节。如果想看全部内容,请参考标准。本书的其他地方已经对一些函数(特别是printf函数、scanf函数以及它们的变异函数)进行了详细介绍,所以这里 只对这类函数做简短的描述。为了获得关于某个函数更详细的信息(包括如何使用这个函数的示 例),请见函数描述右下角用楷体列出的节号。 每个函数描述结尾都有其他与之相关函数的列表。相似函数非常接近于正在描述的函数。相关函数经常会和在描述的函数联合使用。(例如,calloc函数和realloc函数与malloc函数“类似”, 而free函数则与malloc函数“相关”。)也可参见的函数和在描述的函数没有紧密联系,但是却 可能有影响。 如果把函数行为的某些方面描述为由实现定义的,那么这就意味着此函数依赖于C库的实现方式。 函数将始终行为一致,但是结果却可能会由于系统的不同而千差万别。(换句话说,请参考手册了 解可能发生的问题。)另一方面,未定义的行为是一个不好的消息:不但函数的行为可能会因系统 不同而不同,而且程序也可能会行为异常甚至崩溃。 中许多函数的描述提到了定义域错误和取值范围错误。在本附录的末尾对这两种错误进行了定义。 601 下列库函数的行为是会受到当前地区影响的: 字符处理函数(除了isdigit函数和isxdigit函数)。 格式化输入/输出函数。 多字节字符和字符串函数。 字符串转换函数。 Strcoll函数、strftime函数和strxfrm函数。 例如,isalpha函数实际上检测字符是否在a到z之间或者在A到Z之间。在某些区域内也把其他字符看成是字母次序的。本附录描述了在"C"(默认的)地区内库函数的行为。 一些函数实际上是宏。然而,这些宏的用法和函数完全一样,所以这里不对它们区别对待。 abort 异常终止程序 void abort(void); 产生SIGABRT信号。如果无法捕获信号(或者如果信号处理函数返回),那么程序会异常 终止,并且返回由实现定义的代码来说明不成功的终止。是否清洗输出缓冲区,是否关 闭打开的流,以及是否移除临时文件都是由实现定义的。 相似函数exit函数、raise函数 相关函数assert函数、signal函数 也可参见atexit函数 26.2节abs 整数的绝对值 int abs(int j); 返回整数j的绝对值。如果不能表示j的绝对值,那么函数的行为是未定义的。 ①这些材料经ANSI许可改编自American National Standards Institude ANSI/ISO 9899?1990。这个标准的副本可从 ANSI购买(ANSI, 11 West 42nd Street, New York, NY 10036)。

最新sort函数的用法

sort函数的用法 做ACM题的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。STL里面有个sort 函数,可以直接对数组排序,复杂度为n*log2(n)。使用这个函数,需要包含头文件。 做ACM题的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。STL里面有个sort 函数,可以直接对数组排序,复杂度为n*log2(n)。使用这个函数,需要包含头文件。 这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b)。简单来说,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了,默认的排序方式是升序。 拿我出的“AC的策略”这题来说,需要对数组t的第0到len-1的元素排序,就写sort(t,t+len); 对向量v排序也差不多,sort(v.begin(),v.end()); 排序的数据类型不局限于整数,只要是定义了小于运算的类型都可以,比如字符串类string。 如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。比较函数是一个自己定义的函数,返回值是bool型,它规定了什么样的关系才是“小于”。想把刚才的整数数组按降序排列,可以先定义一个比较函数cmp bool cmp(int a,int b) { return a>b; } 排序的时候就写sort(a,a+100,cmp); 假设自己定义了一个结构体node struct node{ int a; int b; double c;

快速排序实验报告

快速排序实验报告 《程序设计实践》报告 学号江元 ; 姓名 090241111 ; 题目序号 2011年题目:排序7.1B类的第5题 ; 难度等级 B 一、题目 写出快速排序的非递归算法 二、问题分析及求解基本思路 问题分析: 快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。而在程序设计中虽然应用递归技术, 能够使得程序简洁易懂, 但是效率并不是最高的,因此可以利用栈结构实现非递归的快速排序。 求解基本思路: 将每次分治的两个序列的高位和低位入栈,每次都从栈中获取一对高位和低位,分别处理。处理过程是:选取高位作为基准位置,从低位开始向高位遍历,如果比基准元素小,那么和第i个交换,如果有交换,那么i++,等一遍遍历完成后,如果i的位置不等于基准位置,那么所选的基准位置的值不是最大的而这时候i的位置之前的元素都比基准值小,那么i的位置应该是基准值,将i所在位置的值和基准位置进行交换。这时候,在i的左右就将序列分成两部分了,一部分比i

所在位置值小,一部分比i所在位置值大的,然后再次将前面一部分和后面一部分的高位和低位分别入栈,再次选择基准位置,直到所选择的区间大小小于2,就可以不用入栈了。 三、问题求解的整体框架结构 输入要排序的元素开始的个数 依次输入要排序的 元素 借助定义的栈 Stack st 传入参数,调用非递 归实现的快速排序函调用函数partition 数qsort() 调用函数swap 非递归快速排序后输结束出排序后的元素顺序 四、主要算法 1(非递归快速排序算法qsrt( a, l , r ): 由partition(pData, low, high)返回了轴值,st.push(low); st.push(pivot - 1); st.push(pivot + 1); st.push(high); 循环执行下列语句直到栈为空 (1)high = st.top(); st.pop(); low = st.top(); st.pop(); (2)若满足low < high,调用 partition(pData, low, high)返回轴值; 定义tmp = pivot -1 若low < tmp,st.push(low); st.push(tmp); tmp = pivot + 1; 若tmp < high,st.push(tmp); st.push(high); 2(算法时间和空间复杂度:

excelvba中使用sort函数对工作表排序的方法

Excel VBA中使用Sort 函数对工作表排序的方法 工作表内单元格数据的排序,使用Range.Sort 命令。但是后面的参数较多,新人一般采用录制宏时出来一大堆,也不知道该如何编辑。因此,我开这一个帖子,给新人普及一下:Range("待排序数据区域").Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase, Orientation, SortMethod, DataOption1, DataOption2, DataOption3)其中各类型参数的意义如下: ① key1、key2、key3 这些key是排序的关键列(或行)的单元格地址,如Range("A1") 实际只要选对列标题即可,对行数要求不敏感。【行数要求不敏感】

即数据区域中任意行数都可以:Range("A1")、或 Range("A2")、或Range("A1000")都可以。【注意】 1. 一次Sort只能调用至多3个参数,没有key4可以使用。 2. 至少使用1个参数即可,即key2、key3可以省去不用。【引用方法】 1. 带参数名引用,如:key1:=Range("G3") 带参数名引用时2. 参数位置引用,即按照上述Sort命令的参数顺序直接应用, 如:Range("A1:I19").Sort key1:=Range("G3") 即第1位置参数即为key1② Order1、Order2、Order3 这些Order是排序的顺序模式指定参数。即:A-Z升序、或Z-A降序 参数的模式名称为: A-Z升序= xlAscending 或直接=1

ACM_ICPC竞赛中sort函数的简要介绍

Electronic Technology & Software Engineering 电子技术与软件工程? 227Program Design ? 程序设计【关键词】sort 函数 程序设计 1 sort函数的介绍及优点 sort 函数是STL 中用于对给定区间 进行排序的函数,所在头文件是#include 。主要原理是快速排序,但又不是 简单的快速排序,它还结合了插入排序和堆排 序,根据需要排序对象的不同情况,自动选用 合适的排序方法。所以虽然理论上sort 函数和 快速排序的复杂度都是O(n*logn),但在实际 应用中,sort 函数比快速排序的效率更高,实 用方法简单,因此更加实用。 2 sort函数的使用方法 sort 函数有三个参数 (1)要排序数组的起始地址。 (2)要排序数组的结束地址,即最后一 个要排序地址的下一个地址。 (3)排序方法,可以是从大到小,也可 以自定义,也可以不写,如果不写,默认的排 序方式是从小到大排序。 sort 函数使用模板是: sort(start,end,cmp); 对区间[?rst,last)根据cmp 的方式进行排 序。 3 sort函数的用法举例 3.1 直接使用 整型默认为从小到大排序,字符型根据 ASCII 码值进行排序。 int a[N]; sort(a+?rst,a+last); N 为整型常数,?rst 为起始地址,last 为 结束地址。 3.2 自定义排序ACM_ICPC 竞赛中sort 函数的简要介绍 文/焦静颐 崔驭 贾子璇 3.2.1 自定义比较函数int a[N];bool cmp(int x,int y){return x>y;}sort(a+?rst,a+last,cmp);系统默认为x>y 返回true ,故程序是从大到小排序。3.2.2 重载比较运算符这种方法用于结构体中。struct point {int a,b;}e[N];bool operator<(const point& x,const point& y){if(x.a==y.a) return x.by.a;}sort(e+?rst,e+last);根据成员a 的数值由大到小排序,当a 的数值相同时,根据成员b 的数值由小到大排序。 4 结束语sort 函数在使用上带来极大便利,因为高效率,使用灵活的特点,无论是在日常开发中还是算法竞赛中,sort 函数都能发挥很大的作用。本文介绍了sort 的使用方法,只要加以练习,就可以将sort 函数更好的应用。掌握好sort 函数对学生学习其他STL 函数也有很大帮助,可以提高学生的编程能力。参考文献[1]Nicolai M.Josuttis.C++标准程序库[M]. 华中科技大学出版社,2002.[2]刘汝佳.算法竞赛入门经典(第二版)[M]. 清华大学出版社,2014.作者简介焦静颐(2000-),女,天津市人。 大学本科在读。主要研究方向为计算机类。作者单位河北农业大学信息科学与技术学院 河北省保定市 071001

php排序函数

一、简单排序 ?函数:sort()和rsort() $data =array(5,8,1,7,2); sort($data); print_r($data); rsort($data); print_r($data); 二、关键字排序 ?函数Ksort()和Krsort() $data = array( "CH" => "China", "IN" => "India", "DE" => "Germany", "ES" = "Spain“ ); ksort($data); print_r($data); krsort($data); print_r($data); 三、按值排序 ?函数asort()和arsort() $data = array("CH" => "China", "IN" => "India", "DE" => "Germany", "ES" => "Spain " ); asort($data); print_r($data); arsort($data); print_r($data); 四、自然语言排序 ?函数:natsort()和array_reverse() $data = array("A", "B", " C"); //sort($data); //print_r($data); natsort($data); print_r($data); natsort($data); print_r(array_reverse($data)); 五、自定义排序 ?函数:usort() $data = array("ajax", "linux", "javascript", "php"); usort($data, 'sortByLen'); print_r($data); function sortByLen($a, $b) { if (strlen($a) == strlen($b)) { return 0; } else { return (strlen($a) > strlen($b)) ? 1 : -1;

qsort函数的用法

六类qsort排序方法 以下是其具体分类及用法(若无具体说明是以降序排列): 1、对一维数组排序: (Element_type是一位数组中存放的数据类型,可以是char, int, float, double, etc )使用qsort之前,必须自己定义一个比较函数。这个比较函数用于比较两个元素的大小。由于qsort可以排序任意数据类型,包括自定义的结构类型,因此,做一个自定义的比较函数是必要的。 int Comp(const void *p1,const void *p2 ) { return *((Element_type *)p2) > *((Element_type *)p1) ? 1 : -1;} int main() { Element_type list[MAX]; initial(list); qsort(list, sizeof(list),sizeof(Element_type),Comp); // qsort的4个参数:数组的首地址、数组的实际大小,元素的实际大小,比较函数 return 0;} 2、对字符串排序: int Comp(const void *p1,const void *p2) { return strcmp((char *)p2,(char *)p1); } int main() { char a[MAX1][MAX2]; initial(a); qsort(a,lenth,sizeof(a[0]),Comp); //lenth 为数组a的长度 3、按结构体中某个关键字排序(对结构体一级排序):

struct Node { double data; int other; }s[100]; int Comp(const void *p1,const void *p2) { return (*(Node *)p2)->data > (*(Node *)p1)->data ? 1 : -1; } qsort(s,100,sizeof(s[0]),Comp); 4、按结构体中多个关键字排序(对结构体多级排序)[以二级为例]:struct Node { int x; int y; }s[100]; //按照x从小到大排序,当x相等时按y从大到小排序 int Comp(const void *p1,const void *p2) { struct Node *c = (Node *)p1; struct Node *d = (Node *)p2; if(c->x != d->x) return c->x-d->x; else return d->y - c->y; }

qsort排序

发信人: snoopy (阿排/好好玩ICPC~), 信区: ACM_ICPC 标题: 快排qsort的用法详解 发信站: 珞珈山水BBS站(Sat Apr 29 21:02:35 2006), 转信 很多人问这个东西.我以前也看了好久,今天翻到以前学快排的时候写的练习code,基本上 能覆盖绝大部分用法了. 里面有很多地方没判断相等的情况,按道理来说相等情况下应该返回0的,这个请看代码的时候注意.我尽量保证代码不出错了. 下面的这些说明和问题都是个人原创,没查什么资料,所以不保证其完全正确性,在此表示个 人不对出现的问题负任何责任,大家WA了或者干吗的不要怪我,不过至少目前来说我用起来 是没问题的:) /*----------------------------------------------------------------------------*/ ** 关于快排函数的一些说明** qsort,包含在stdlib.h头文件里,函数一共四个参数,没返回值.一

个典型的qsort的写法如下 qsort(s,n,sizeof(s[0]),cmp); 其中第一个参数是参与排序的数组名(或者也可以理解成开始排序的地址,因为可以写&s[i]这样的表达式,这个问题下面有说明); 第二个参数是参与排序的元素个数; 第三个三数是单个元素的大小,推荐使用sizeof(s[0])这样的表达式,下面也有说明:) ; 第四个参数就是很多人觉得非常困惑的比较函数啦,关于这个函数,还要说的比较麻烦... 我们来讨论cmp这个比较函数(写成cmp是我的个人喜好,你可以随便写成什么,比如qcmp什么 的).典型的cmp的定义是 int cmp(const void *a,const void *b); 返回值必须是int,两个参数的类型必须都是const void *,那个a,b 是我随便写的,个人喜好. 假设是对int排序的话,如果是升序,那么就是如果a比b大返回一个正值,小则负值,相等返回0,其他的依次类推,后面有例子来

c++sort()函数的用法

C++sort()函数的用法 近来看了c++标准库这本书,学到了很多,就把这其中的一点C++sort()函数的用法写下来和大家分享吧! (一)为什么要用c++标准库里的排序函数 Sort()函数是c++一种排序方法之一,学会了这种方法也打消我学习c++以来使用的冒泡排序和选择排序所带来的执行效率不高的问题!因为它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n),执行效率较高! (二)c++标准库里的排序函数的使用方法 I)Sort函数包含在头文件为#include的c++标准库中,调用标准库里的排序方法可以不必知道其内部是如何实现的,只要出现我们想要的结果即可! II)Sort函数有三个参数: (1)第一个是要排序的数组的起始地址。 (2)第二个是结束的地址(最后一位要排序的地址) (3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。Sort函数使用模板: Sort(start,end,,排序方法) 下面就具体使用sort()函数结合对数组里的十个数进行排序做一个说明! 例一:sort函数没有第三个参数,实现的是从小到大

#include #include using namespace std; int main() { int a[10]={9,6,3,8,5,2,7,4,1,0}; for(int i=0;i<10;i++) cout<b; }

相关文档
最新文档