【c语言中sort的用法详解】c语言sort
c语言中sort的用法详解
c语言中sort的用法详解 c语言中sort的用法的用法 sort是STL中提供的算法,头文件为#includealgorithm以及using namespace std;
函数原型如下:
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 );
使用第一个版本是对[first,last)进行升序排序,默认操作符为““,第二 个版本使用comp函数进行排序控制,comp包含两个在[first,last)中对应的值,如 果使用""则为升序排序,如果使用""则为降序排序,分别对int、float、char以及 结构体排序例子如下: 1 2 3 4 56 7 8 9 1
0 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3031 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 5556 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 #includestdio.h #includealgorithm #includestring using namespace std;
struct product{ char name;
float price;
};
int array_int={4,1,2,5,3};char array_char={"a","c","b","e","d"};
double array_double={1.2,2.3,5.2,4.6,3.5};
//结构比较函数(按照结构中的浮点数值进行排序) bool compare_struct_float(const product a,const product b){ return a.priceb.price;
} //结构比较函数(按照结构中的字符串进行排序) bool compare_struct_str(const product a,const product b){ return string(a.name)string(b.name);
} //打印函数 void print_int(const int* a,int length){ printf("升序排序后的int数组:¥n");
for(int i=0;
ilength-1;
i++) printf("%d ",a[i]);
printf("%d¥n",a[length-1]);
} void print_char(const char* a,int length){ printf("升序排序后的char数组:¥n");
for(int i=0;
ilength-1;
i++) printf("%c ",a[i]);
printf("%c¥n",a[length-1]);
} void print_double(const double* a,int length){printf("升序排序后的dobule数组:¥n");
for(int i=0;
ilength-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;
ilength;
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 }};
//整数排序 sort(array_int,array_int+5);
print_int(array_int,5);
//字符排序 sort(array_char,array_char+5);
print_char(array_char,5);
//浮点排序sort(array_double,array_double+5);
print_double(array_double,5);
//结构中浮点排序 int len = sizeof(structs)/sizeof(struct product);
sort(structs,structs+len,compare_struct_float);
printf("按结构中float升序排序后的struct数组:¥n");
print_struct_array(structs, len);
//结构中字符串排序 sort(structs,structs+len,compare_struct_str);
printf("按结构中字符串升序排序后的struct数组:¥n");
print_struct_array(structs, len);
} sort函数的用法 做ACM题的时候,排序是一种经常要用到的操作。如果每次都自己 写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还 很有可能写错。STL里面有个sort函数,可以直接对数组排序,复杂度为n*log2(n)。
使用这个函数,需要包含头文件。
这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首 地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b)。简 单来说,有一个数组int a,要对从a到a的元素进行排序,只要写 sort(a,a+100)就行了,默认的排序方式是升序。
拿我出的“AC的策略”这题来说,需要对数组t的第0到len-1的元素排序, 就写sort(t,t+len);
对向量v排序也差不多,sort(v.begin(),v.end());
排序的数据类型不局限于整数,只要是定义了小于运算的类型都可以,比如字符串类string。
如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要 用到第三参数——比较函数。比较函数是一个自己定义的函数,返回值是bool 型,它规定了什么样的关系才是“小于”。想把刚才的整数数组按降序排列,可以 先定义一个比较函数cmp 1 2 3 4 bool cmp(int a,int b) { return ab;
} 排序的时候就写sort(a,a+100,cmp);
假设自己定义了一个结构体node 1 2 3 4 5 struct node{ int a;
int b;double c;
} 有一个node类型的数组node arr,想对它进行排序:先按a值升序 排列,如果a值相同,再按b值降序排列,如果b还相同,就按c降序排列。就可以 写这样一个比较函数:
以下是代码片段:
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.by.b;
return ;
} 排序时写sort(arr,a+100,cmp);
1 2 3 45 qsort(s,n,sizeof(s),cmp);
int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b;
} sort函数的用法:对int类型数组排序 1 2 3 4 5 6 7 int num;
Sample: int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b;
} qsort(num,100,sizeof(num),cmp);
sort函数的用法:对char类型数组排序(同int类型) 12 3 4 5 6 7 char word;
Sample: int cmp( const void *a , const void *b ) { return *(char *)a - *(int *)b;
} qsort(word,100,sizeof(word),cmp);
sort函数的用法:对double类型数组排序(特别要注意) 1 2 3 4 5 6 double in;
int cmp( const void *a , const void *b ) { return *(double *)a *(double *)b 1 : -1;} qsort(in,100,sizeof(in),cmp);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论