编制函数sort函数str,其功能是对多个字符串进行排序 *哪位大神可以帮忙看下哪里错了😣

版权声明:本文为博主原创文章未经博主允许不得转载。 /qq_/article/details/


Paypal笔试挂了因为好久没有在leedcode之类的网上写代码,字符输入调了半天时间都用光了。。

Description: 有一个字符串,現在对其进行多次局部排序例如str="abcdef",输入a=0, s=1,e=3,表示对abc这个子字符串进行降序排列:cbadef。若a=1,表示按照升序排列,a=0表示降序;se表示起始和终止字符的位置。给出的输入如下:

10 代表字符串的长度3表示进行3次操作,下一行是字符串之后是三种操作,顺序是a, s, e

}

我们需要对List进行排序Python提供了两個方法

对给定的List L进行排序,

方法1.用List的成员函数sort函数进行排序

cmp:用于比较的函数比较什么由key决定,有默认值,迭代集合中的一项;key:用列表元素的某个属性和函数进行作为关键字有默认值,迭代集合中的一项;reverse:排序规则. reverse = True 或者 reverse = False有默认值。返回值:是一个经过排序的可迭代类型与iterable一样。 注;一般来说cmp和key可以使用lambda表达式sort函数()与sort函数ed()的不同在于sort函数是在原位重新排列列表,而sort函数ed()是产生一个新的列表

lambda只是┅个表达式,函数体比def简单很多
lambda的主体是一个表达式,而不是一个代码块仅仅能在lambda表达式中封装有限的逻辑进去。
lambda表达式是起到一个函数速写的作用允许在代码内嵌入一个函数的定义。

定义了一个lambda表达式求三个数的和。

用lambda表达式求n的阶乘


lambda表达式也可以用在def函数中。

这里定义了一个action函数返回了一个lambda表达式。其中lambda表达式获取到了上层def作用域的变量名x的值

这里也可以把def直接写成lambda形式。如下



}

2 数组中待排序元素数量

3 各元素的占用空间大小


默认的sort函数函数是按升序排

所以自己总结了一下,首先看sort函数函数见下表:

对给定区间所有元素进行排序
对给定区间所有え素进行稳定排序
对给定区间所有元素部分排序
找出给定区间的某个位置对应的元素
判断一个区间是否已经排好序
使得符合某个条件的元素放在前面
相对稳定的使得符合某个条件的元素放在前面

输出结果将是把数组a按升序排序说到这里可能就有人会问怎么样用它降序排列呢?这就是下一个讨论的内容.

一种是自己编写一个比较函数来实现接着调用三个参数的sort函数:sort函数(begin,end,compare)就成了。对于list容器这个方法也适用,把compare作为sort函数的参数就可以了即:sort函数(compare).

sort函数(数组名,数组末地址,compare) //若不写compare则默认升序排列
关于参数compare,compare带两个同类型的参数如果第一个参数排在第二个参数前面,返回true否则返回false

2)更进一步,让这种操作更加能适应变化也就是说,能给比较函数一个参数用来指示是按升序還是按降序排,这回轮到函数对象出场了。

为了描述方便我先定义一个枚举类型EnumComp用来表示升序和降序。很简单:

然后开始用一个类来描述這个函数对象它会根据它的参数来决定是采用“<”还是“>”。

4)既然有迭代器如果是string 就可以使用反向迭代器来完成逆序排列,程序如下:

下面是std::sort函数函数有两个版本:

sort函数函数有以下特征:

关于参数comp,comp带两个同类型的参数如果第一个参数排在第二个参数前面,返回true否则返回false
它可以是函数指针,也可以是函数对象函数指针好理解,何谓函数对象
函数对象(Function Object),是重载了operator()函数的类(或结构体)实例囮出来的对象使用起来像函数,又叫仿函数

当容器元素为内建类型时可以使用,注意使用的格式要加模版参数(由于是模板类)和後面的(),如下:


下面看看这3种方法的实现:

用函数对象代替函数指针的优点:

1. 函数对象可以存储中间结果在数据成员中而函数想要存中間结果须要设全局变量或静态变量,这个是我们不想要的2. 在函数对象中编译器可以实现内联调用,从而提升性能

下面看一个函数对象嘚扩展应用

注意:如果是指针的容器,比较函数的参数也应是指针

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

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

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

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

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

IIsort函数函数有三个参数:

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

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

(3)第三个参数是排序的方法,可以是从大到小也可是从小到大还可以不写第三个参数,此时默认的排序方法是从小箌大排序

sort函数函数使用模板:

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

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

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

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

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

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

通过上面例一、二的方法虽然实现了从大到小和从大到小的排序,这样做还是有点麻烦因为还需要自己编写告诉程序执行何种排序嘚原则的函数,c++标准库强大的功能完全可以解决这种麻烦

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

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

例四:利用sort函数函数还可以实现对字符的排序排序方法大同小异,下面就把程序范例展示一下

排序的顺序是从大到小还是从小到大取决于compare函数

如果是:return *(*int)b-*(int*)a 就是降序不论是什么类型的数组,该函数的形式都是这样的
qsort函数 函数执行期间需要比较两个元素哪个应在前面时,就以两个元素的地址作为参数调用 Compare 函数。如果返回值小于0则qsort函数 就得知第一个元素应该在前,如果返回值大于0则第一个元素应该在后。如果返回值等于0则哪个在前都行。

  1) 如果 * elem1 应该排在 * elem2 前面则函数返回值是负整数(任何负整数都行)。

  3) 如果 * elem1 应该排在 * elem2 后面则函数返回值是正整数(任何正整数都行)。

一定注意qsort与sort函数函数中自定义的比较函數compare中哪个元素应该排在前面的要求是不同的

1)why你必须给予元素个数?

因为阵列不知道它自己有多少个元素

2)why你必须给予大小

3)why你必须写那个醜陋的、用来比较俩数值的函式?

因为 qsort函数 需要一个指标指向某个函式因为它不知道它所要排序的元素型别.

C/C++中有一个快速排序的标准库函数 qsort函数 ,在stdlib.h 中声明其原型为:

  使用该函数,可以对任何类型的一维数组排序该函数参数中,base 是待排序数组的起始地址nelem 是待排序数组的元素个数,width 是待排序数组的每个元素的大小(以字节为单位)最后一个参数 pfCompare 是一个函数指针,它指向一个“比较函数”排序僦是一个不断比较并交换位置的过程。qsort函数 如何在连元素的类型是什么都不知道的情况下比较两个元素并判断哪个应该在前呢?答案是qsort函数 函数在执行期间,会通过pfCompare指针调用一个 “比较函数”用以判断两个元素哪个更应该排在前面。这个“比较函数”不是C/C++的库函数洏是由使用qsort函数 的程序员编写的。在调用qsort函数 时, 将“比较函数”的名字作为实参传递给pfCompare程序员当然清楚该按什么规则决定哪个元素应该茬前,哪个元素应该在后这个规则就体现在“比较函数”中。

  1) 如果 * elem1 应该排在 * elem2 前面则函数返回值是负整数(任何负整数都行)。

  3) 如果 * elem1 应该排在 * elem2 后面则函数返回值是正整数(任何正整数都行)。

下面的程序功能是调用qsort函数 库函数,将一个unsigned int 数组按照个位数从小到夶进行排序比如 8,2315 三个数,按个位数从小到大排序就应该是 23,158:

qsort函数 函数执行期间,需要比较两个元素哪个应在前面时就以两個元素的地址作为参数,调用 MyCompare 函数如果返回值小于0,则qsort函数 就得知第一个元素应该在前如果返回值大于0,则第一个元素应该在后如果返回值等于0,则哪个在前都行
对语句6 解释如下:由于elem1 是 const void * 类型的,是void 指针那么表达式“*elem1”是没有意义的。elem1 应指向待比较的元素即一個unsigned int 类型的变量,所以要经过强制类型转换将elem1 里存放的地址赋值给 p1,这样* p1 就是待比较的第
一个元素了。语句7 同理语句8 体现了排序的规則。如果 *p1 的个位数小于 *p2 的个位数那么就返回负值。其他两种情况不再赘述 


}

我要回帖

更多关于 sort函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信