2023-02-14 16:31:19來源:互聯(lián)網(wǎng)
最近這段時(shí)間總有小伙伴問小編c語言中sort的用法詳解是什么,小編為此在網(wǎng)上搜尋了一些有關(guān)于c語言中sort的用法詳解的知識(shí)送給大家,希望能解答各位小伙伴的疑惑。
(資料圖片)
c語言的學(xué)習(xí)很多是比較復(fù)雜的,那么c語言中sort的用法的用法你知道嗎?下面七考網(wǎng)小編就跟你們?cè)敿?xì)介紹下c語言中sort的用法的用法,希望對(duì)你們有用。
sort是STL中提供的算法,頭文件為#include<algorithm>以及using namespace std; 函數(shù)原型如下:
?
1
2
3
4
5
template <class RandomAccessIterator>
void sort ( RandomAccessIterator first, RandomAccessIterator last );
template <class RandomAccessIterator, class Compare>
void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
使用第一個(gè)版本是對(duì)[first,last)進(jìn)行升序排序,默認(rèn)操作符為"<",第二個(gè)版本使用comp函數(shù)進(jìn)行排序控制,comp包含兩個(gè)在[first,last)中對(duì)應(yīng)的值,如果使用"<"則為升序排序,如果使用">"則為降序排序,分別對(duì)int、float、char以及結(jié)構(gòu)體排序例子如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include<stdio.h>
#include<algorithm>
#include<string>
using namespace std;
struct product{
char name[16];
float price;
};
int array_int[5]={4,1,2,5,3};
char array_char[5]={"a","c","b","e","d"};
double array_double[5]={1.2,2.3,5.2,4.6,3.5};
//結(jié)構(gòu)比較函數(shù)(按照結(jié)構(gòu)中的浮點(diǎn)數(shù)值進(jìn)行排序)
bool compare_struct_float(const product &a,const product &b){
return a.price<b.price;
}
//結(jié)構(gòu)比較函數(shù)(按照結(jié)構(gòu)中的字符串進(jìn)行排序)
bool compare_struct_str(const product &a,const product &b){
return string(a.name)<string(b.name);
}
//打印函數(shù)
void print_int(const int* a,int length){
printf("升序排序后的int數(shù)組:\n");
for(int i=0; i<length-1; i++)
printf("%d ",a[i]);
printf("%d\n",a[length-1]);
}
void print_char(const char* a,int length){
printf("升序排序后的char數(shù)組:\n");
for(int i=0; i<length-1; i++)
printf("%c ",a[i]);
printf("%c\n",a[length-1]);
}
void print_double(const double* a,int length){
printf("升序排序后的dobule數(shù)組:\n");
for(int i=0; i<length-1; i++)
printf("%.2f ",a[i]);
printf("%.2f\n",a[length-1]);
}
void print_struct_array(struct product *array, int length)
{
for(int i=0; i<length; i++)
printf("[ name: %s \t price: $%.2f ]\n", array[i].name, array[i].price);
puts("--");
}
void main()
{
struct product structs[] = {{"mp3 player", 299.0f}, {"plasma tv", 2200.0f},
{"notebook", 1300.0f}, {"smartphone", 499.99f},
{"dvd player", 150.0f}, {"matches", 0.2f }};
//整數(shù)排序
sort(array_int,array_int+5);
print_int(array_int,5);
//字符排序
sort(array_char,array_char+5);
print_char(array_char,5);
//浮點(diǎn)排序
sort(array_double,array_double+5);
print_double(array_double,5);
//結(jié)構(gòu)中浮點(diǎn)排序
int len = sizeof(structs)/sizeof(struct product);
sort(structs,structs+len,compare_struct_float);
printf("按結(jié)構(gòu)中float升序排序后的struct數(shù)組:\n");
print_struct_array(structs, len);
//結(jié)構(gòu)中字符串排序
sort(structs,structs+len,compare_struct_str);
printf("按結(jié)構(gòu)中字符串升序排序后的struct數(shù)組:\n");
print_struct_array(structs, len);
}
做ACM題的時(shí)候,排序是一種經(jīng)常要用到的操作。如果每次都自己寫個(gè)冒泡之類的O(n^2)排序,不但程序容易超時(shí),而且浪費(fèi)寶貴的比賽時(shí)間,還很有可能寫錯(cuò)。STL里面有個(gè)sort函數(shù),可以直接對(duì)數(shù)組排序,復(fù)雜度為n*log2(n)。使用這個(gè)函數(shù),需要包含頭文件。
這個(gè)函數(shù)可以傳兩個(gè)參數(shù)或三個(gè)參數(shù)。第一個(gè)參數(shù)是要排序的區(qū)間首地址,第二個(gè)參數(shù)是區(qū)間尾地址的下一地址。也就是說,排序的區(qū)間是[a,b)。簡(jiǎn)單來說,有一個(gè)數(shù)組int a[100],要對(duì)從a[0]到a[99]的元素進(jìn)行排序,只要寫sort(a,a+100)就行了,默認(rèn)的排序方式是升序。
拿我出的“AC的策略”這題來說,需要對(duì)數(shù)組t的第0到len-1的元素排序,就寫sort(t,t+len);
對(duì)向量v排序也差不多,sort(v.begin(),v.end());
排序的數(shù)據(jù)類型不局限于整數(shù),只要是定義了小于運(yùn)算的類型都可以,比如字符串類string。
如果是沒有定義小于運(yùn)算的數(shù)據(jù)類型,或者想改變排序的順序,就要用到第三參數(shù)——比較函數(shù)。比較函數(shù)是一個(gè)自己定義的函數(shù),返回值是bool型,它規(guī)定了什么樣的關(guān)系才是“小于”。想把剛才的整數(shù)數(shù)組按降序排列,可以先定義一個(gè)比較函數(shù)cmp
?
1
2
3
4
bool cmp(int a,int b)
{
return a>b;
}
排序的時(shí)候就寫sort(a,a+100,cmp);
假設(shè)自己定義了一個(gè)結(jié)構(gòu)體node
?
1
2
3
4
5
struct node{
int a;
int b;
double c;
}
有一個(gè)node類型的數(shù)組node arr[100],想對(duì)它進(jìn)行排序:先按a值升序排列,如果a值相同,再按b值降序排列,如果b還相同,就按c降序排列。就可以寫這樣一個(gè)比較函數(shù):
以下是代碼片段:
?
1
2
3
4
5
6
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;
}
排序時(shí)寫sort(arr,a+100,cmp);
?
1
2
3
4
5
qsort(s[0],n,sizeof(s[0]),cmp);
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
?
1
2
3
4
5
6
7
int num[100];
Sample:
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}
qsort(num,100,sizeof(num[0]),cmp);
?
1
2
3
4
5
6
7
char word[100];
Sample:
int cmp( const void *a , const void *b )
{
return *(char *)a - *(int *)b;
}
qsort(word,100,sizeof(word[0]),cmp);
?
1
2
3
4
5
6
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);
?
1
2
3
4
5
6
7
8
9
10
11
struct In
{
double data;
int other;
}s[100]
//按照data的值從小到大將結(jié)構(gòu)體排序,關(guān)于結(jié)構(gòu)體內(nèi)的排序關(guān)鍵數(shù)據(jù)data的類型可以很多種,參考上面的例子寫
int cmp( const void *a ,const void *b)
{
return ((In *)a)->data - ((In *)b)->data ;
}
qsort(s,100,sizeof(s[0]),cmp);
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct In
{
int x;
int y;
}s[100];
//按照x從小到大排序,當(dāng)x相等時(shí)按照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);
?
1
2
3
4
5
6
7
8
9
10
11
struct In
{
int data;
char str[100];
}s[100];
//按照結(jié)構(gòu)體中字符串str的字典順序排序
int cmp ( const void *a , const void *b )
{
return strcmp( ((In *)a)->str , ((In *)b)->str );
}
qsort(s,100,sizeof(s[0]),cmp);
?
1
2
3
4
5
6
7
8
9
int cmp(const void *a,const void *b) //重點(diǎn)cmp函數(shù),把除了1點(diǎn)外的所有點(diǎn),旋轉(zhuǎn)角度排序
{
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)) //如果在一條直線上,則把遠(yuǎn)的放在前面
return 1;
else return -1;
}
一級(jí)建造師 二級(jí)建造師 消防工程師 消防設(shè)施操作員 BIM 造價(jià)工程師 環(huán)評(píng)師 監(jiān)理工程師 咨詢工程師 安全工程師 建筑九大員 公路水運(yùn)檢測(cè) 通信工程 智慧消防工程師 裝配工程師 一級(jí)注冊(cè)建筑師 二級(jí)注冊(cè)建筑師 注冊(cè)電氣工程師 智慧建造工程師 房地產(chǎn)估價(jià)師 應(yīng)急救援員 EPC工程總承包 PLC智能制造 碳排放管理師 雅思 托福 GRE 托業(yè) SAT GMAT A-Level ACT AP課程 OSSD 多鄰國(guó)英語 考研英語 英語四六級(jí) 商務(wù)英語 青少兒英語 IB英語 劍橋英語 職場(chǎng)英語 提升英語 AEAS 英語口語 出國(guó)英語 初高中英語 學(xué)生英語 成人英語 公共英語 詞庫 經(jīng)濟(jì)師 初級(jí)會(huì)計(jì)師 中級(jí)會(huì)計(jì)師 注冊(cè)會(huì)計(jì)師 基金從業(yè) 證券從業(yè) 薪稅師 銀行從業(yè) CMA ACCA 會(huì)計(jì)實(shí)訓(xùn) 稅務(wù)師 CFA 企業(yè)合規(guī)師 審計(jì)師 FRM 高級(jí)會(huì)計(jì)師 會(huì)計(jì)就業(yè) 期貨從業(yè) CQF 真賬實(shí)操技能 葡萄牙語 日語 德語 法語 韓語 西班牙 意大利 高考小語種 粵語 泰語 俄語 阿拉伯語 優(yōu)路 火星時(shí)代 環(huán)球雅思 櫻花日語 啟德雅思 新通 達(dá)內(nèi) 高頓 童程童美 樂博樂博 小碼王 秦漢胡同 新航道 秦學(xué)教育 學(xué)大教育 東方瑞通