sort函数的用法

本文介绍了如何在C++代码中高效地使用STL的sort函数进行数组、向量和自定义结构体的排序。包括默认排序、自定义排序规则、不同数据类型排序的方法及实例演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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类型的数组nodearr[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);

qsort(s[0],n,sizeof(s[0]),cmp);
int cmp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}

 

一、对int类型数组排序  

int num[100];  

Sample:  

int cmp ( const void *a , const void *b )  
{  
return *(int *)a - *(int *)b;  
}  

qsort(num,100,sizeof(num[0]),cmp);  

二、对char类型数组排序(同int类型)  

char word[100];  

Sample:  

int cmp( const void *a , const void *b )  
{  
return *(char *)a - *(int *)b;  
}  

qsort(word,100,sizeof(word[0]),cmp);  

三、对double类型数组排序(特别要注意)  

double in[100];  

int cmp( const void *a , const void *b )  
{  
return *(double *)a > *(double *)b ? 1 : -1;  
}  

qsort(in,100,sizeof(in[0]),cmp);  

四、对结构体一级排序  

struct In  
{  
double data;  
int other;  
}s[100]  

//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写  

int cmp( const void *a ,const void *b)  
{  
return ((In *)a)->data - ((In *)b)->data ;  
}  

qsort(s,100,sizeof(s[0]),cmp);  

五、对结构体 

struct In  
{  
int x;  
int y;  
}s[100];  

//按照x从小到大排序,当x相等时按照y从大到小排序  

int cmp( const void *a , const void *b )  
{  
struct In *c = (In *)a;  
struct In *d = (In *)b;  
if(c->x != d->x) return c->x - d->x;  
else return d->y - c->y;  
}  

qsort(s,100,sizeof(s[0]),cmp);  

六、对字符串进行排序  

struct In  
{  
int data;  
char str[100];  
}s[100];  

//按照结构体中字符串str的字典顺序排序  

int cmp ( const void *a , const void *b )  
{  
return strcmp( ((In *)a)->str , ((In *)b)->str );  
}  

qsort(s,100,sizeof(s[0]),cmp);  

七、计算几何中求凸包的cmp  

intcmp(const void *a,const void *b) //重点cmp函数,把除了1点外的所有点,旋转角度排序  
{  
struct point *c=(point *)a;  
struct point *d=(point *)b;  
if( calc(*c,*d,p[1]) < 0) return 1;  
else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) <dis(d->x,d->y,p[1].x,p[1].y)) //如果在一条直线上,则把远的放在前面  
return 1;  
else return -1;  
}

 

<think>好的,我现在需要回答用户关于sort函数使用方法的问题。首先,我得确定用户指的是哪种编程语言中的sort函数,因为不同语言的实现可能不同。但用户没有特别说明,可能是指常见的几种语言,比如Python、C++或者JavaScript。我需要覆盖主要的几种情况,同时保持回答的结构清晰。 首先,我应该分语言介绍sort函数的使用方法,这样用户可以根据自己的需求找到对应的部分。Python中的列表有sort()方法和sorted()函数,两者的区别需要讲清楚。例如,sort()是原地排序,而sorted()返回新列表。参数方面,key和reverse是常用的,需要举例说明,比如如何按字符串长度排序,或者降序排列。 接下来是C++中的sort函数,属于STL算法库,通常用于数组或容器如vector。这里需要提到头文件#include <algorithm>,以及如何使用迭代器作为参数。例如,sort(vec.begin(), vec.end()),还可以自定义比较函数或者lambda表达式。比如降序排列或者按结构体的某个成员排序。 然后是JavaScript,数组的sort()方法默认是按字符串Unicode码点排序,这对数字排序可能会有问题,所以需要传入比较函数。比如arr.sort((a, b) => a - b)来实现数字升序排序。还可以举例如何降序排列,或者根据对象属性排序。 此外,可能还需要提到其他语言如Java、Ruby等的sort函数,但为了避免信息过载,可能先集中在最常用的几种上。同时,需要注意中文术语的准确性,比如“原地排序”、“比较函数”等。 需要确保每个例子中的LaTeX格式正确,行内公式用$...$,比如在提到时间复杂度时,如快速排序的平均时间复杂度是$O(n \log n)$。如果有独立公式,比如算法的时间复杂度公式,需要用$$...$$,不过可能在这个问题中例子较少,但要注意用户提到的系统级指令。 另外,用户要求回答结构清晰,逐步解决问题,所以可能需要先介绍基本用法,再讲参数和高级用法,比如自定义排序规则。每个部分用标题分隔,可能用数字或项目符号,但在转换为正式回答时可能需要调整。 检查是否有LaTeX语法错误,比如转义字符是否正确,例如下划线是否需要用反斜杠转义。例如,在Python的key=lambda x: x[1]中,可能不需要LaTeX,但在提到数学表达式时正确使用。 最后,总结不同语言中sort函数的异同,帮助用户理解核心概念,如原地排序、稳定排序等。同时提醒用户注意不同语言的默认行为差异,比如JavaScript的默认排序可能导致的数字排序问题。 现在需要组织这些内容,确保符合用户的要求:结构清晰,分步骤说明,正确使用LaTeX,中文回答,覆盖主要语言的使用方法。</think>以下分语言介绍`sort`函数的使用方法,结构清晰且包含关键注意事项: --- ### 一、Python中的sort函数 1. **列表原地排序** 使用`list.sort()`方法,直接修改原列表,无返回值: ```python arr = [3, 1, 4, 2] arr.sort() # 结果为[1, 2, 3, 4] ``` 2. **sorted()函数生成新列表** 不修改原列表,返回排序后的新列表: ```python new_arr = sorted([3, 1, 4, 2]) # new_arr为[1, 2, 3, 4] ``` 3. **关键参数** - `key`:自定义排序依据 ```python words = ["apple", "banana", "cherry"] words.sort(key=lambda x: len(x)) # 按长度排序 → ["apple", "cherry", "banana"] ``` - `reverse`:降序排列 ```python arr.sort(reverse=True) # 降序 → [4, 3, 2, 1] ``` --- ### 二、C++中的sort函数 1. **基本用法** ```cpp #include <algorithm> #include <vector> using namespace std; vector<int> vec = {3, 1, 4, 2}; sort(vec.begin(), vec.end()); // 升序 → {1, 2, 3, 4} ``` 2. **自定义比较函数** ```cpp // 降序排列 bool compare(int a, int b) { return a > b; } sort(vec.begin(), vec.end(), compare); ``` 3. **Lambda表达式(C++11+)** ```cpp sort(vec.begin(), vec.end(), [](int a, int b) { return a % 2 < b % 2; // 偶数在前,奇数在后 }); ``` --- ### 三、JavaScript中的sort函数 1. **默认行为** 默认按字符串Unicode排序,对数字不友好: ```javascript let arr = [10, 2, 1]; arr.sort(); // 结果为[1, 10, 2] ``` 2. **数字排序** 需传入比较函数: ```javascript arr.sort((a, b) => a - b); // 升序 → [1, 2, 10] arr.sort((a, b) => b - a); // 降序 → [10, 2, 1] ``` 3. **对象属性排序** ```javascript let users = [{age:25}, {age:18}, {age:30}]; users.sort((a, b) => a.age - b.age); // 按age升序排列 ``` --- ### 四、通用注意事项 1. **时间复杂度** 常见实现(如Python、C++)使用快速排序,平均时间复杂度为$O(n \log n)$,最坏情况$O(n^2)$。 2. **稳定性** - Python的`sort`和C++的`stable_sort`是稳定排序(相等元素顺序不变)。 - JavaScript的排序稳定性取决于浏览器引擎(ES2019后要求稳定)。 3. **原地与非原地** - 原地排序:Python的`list.sort()`、C++的`sort`。 - 非原地排序:Python的`sorted()`、JavaScript的`sort`(返回新数组需赋值)。 --- 通过以上示例,可快速掌握不同语言中`sort`的核心用法,重点注意**默认排序规则**和**自定义比较方法**的实现差异。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值