C程序 sort函数

C程序 sort函数,第1张

C语言中没有预置的sort函数。如果在C语言中,遇到有调用sort函数,就是自定义的氏搜一个函数,功能一般用于排序。

一、可以编写自己的sort函数。

如下函数为将整型数组从小到大排序。

void sort(int *a, int l)//a为数组地址,l为数组长度。

{

int i, j

int v

//排序主体

for(i = 0 i < l - 1 i ++)

for(j = i+1 j < l j ++)

{

if(a[i] > a[j])//如前面的比后面的大,则交换。

{

v = a[i]

a[i] = a[j]

a[j] = v

}

        }}

对于这样的自定义sort函数,可以按照定义的规范来调用。

二、C语言有自有的qsort函数。

功 能: 使用快速排序例程进行排序

头文件:stdlib.h

原型: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *))

参数:

1 待排序数组首地址

2 数组中待排序元素数量肢顷

3 各元素的占用空间大小

4 指向函数的指针,用于确定排序的顺序

这个函数必须要歼饥历自己写比较函数,即使要排序的元素是int,float一类的C语言基础类型。

以下是qsort的一个例子:

#include<stdio.h>

#include<stdlib.h>

int comp(const void*a,const void*b)//用来做比较的函数。

{

return *(int*)a-*(int*)b

}

int main()

{

int a[10] = {2,4,1,5,5,3,7,4,1,5}//乱序的数组。

int i

qsort(a,n,sizeof(int),comp)//调用qsort排序

for(i=0i<10i++)//输出排序后的数组

{

printf("%d\t",array[i])

}

return 0

}

扩展资料:

sort函数的用法(C++排序库函数的调用)

对数组进行排序,在c++中有库函数帮我们实现,这们就不需要我们自己来编程进行排序了。

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

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

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

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

II)Sort函数有三个参数:

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

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

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

Sort函数使用模板:

Sort(start,end,排序方法)

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

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

#include<iostream>

#include<algorithm>

using namespace std

int main()

{

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

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

cout<<a[i]<<endl

sort(a,a+11)

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

cout<<a[i]<<endl

return 0

}

编译器

GCC,GNU组织开发的开源免费的编译器

MinGW,Windows *** 作系统下的GCC

Clang,开源的BSD协议的基于LLVM的编译器

Visual C++ :: cl.exe,Microsoft VC++自带的编译器

集成开发环境

CodeBlocks,开源免费的C/C++ IDE

CodeLite,开源、跨平台的C/C++集成开发环境

Orwell Dev-C++,可移植的C/C++IDE

C-Free

Light Table

Visual Studio系列

Hello World

参考资料:百度百科-sort函数

c语言的学习很多是比较复杂的,那么c语言中sort的用法的用法你知道吗?下面我就跟你们详细介绍下c语言中sort的用法的用法,希望对你们有用。

c语言中sort的用法的用法

sort是STL中提供的算法,头文件为#include<algorithm>以及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

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}

//结构比较函数(按照结构中的浮点数值进行排序)

bool compare_struct_float(const product &a,const product &b){

return a.price<b.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=0i<length-1i++)

printf("%d ",a[i])

printf("%d\n",a[length-1])

}

void print_char(const char* a,int length){

printf("升序排序后的char数组:\n")

for(int i=0i<length-1i++)

printf("%c ",a[i])

printf("%c\n",a[length-1])

}

void print_double(const double* a,int length){

printf("升序排序后的dobule数组:\n")

for(int i=0i<length-1i++)

printf("%.2f ",a[i])

printf("%.2f\n",a[length-1])

}

void print_struct_array(struct product *array, int length)

{

for(int i=0i<lengthi++)

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[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

?

1

2

3

4

bool cmp(int a,int b)

{

return a>b

}

排序的时候就写sort(a,a+100,cmp)

假设自己定义了一个结构体node

?

1

2

3

4

5

struct node{

int a

int b

double c

}

有一个node类型的数组node arr[100],想对它进行排序:先按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.b>y.b

return return x.c>y.c

}

排序时写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

}

sort函数的用法:对int类型数组排序

?

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)

sort函数的用法:对char类型数组排序(同int类型)

?

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)

sort函数的用法:对double类型数组排序(特别要注意)

?

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);

sort函数的用法:对结构体一级排序

?

1

2

3

4

5

6

7

8

9

10

11

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)

sort函数的用法:对结构体

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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)

sort函数的用法:对字符串进行排序

?

1

2

3

4

5

6

7

8

9

10

11

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)

sort函数的用法:计算几何中求凸包的cmp

?

1

2

3

4

5

6

7

8

9

int cmp(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

}

猜你喜欢:

1. c中的用法

2. c语言中逻辑或的用法

3. c语言strcmp的用法

4. c语言中free的用法

5. c语言pow的用法

6. c语言中putchar的用法

sort()函数描述基饥:对给定区间所有元素进行排序。

sort()函数语法:sort(begin,end),表示一个范围空锋坦。

sort()函数举例:

int _tmain(int argc, _TCHAR* argv[])

{

int a[20]={2,4,1,23,5,76,0,43,24,65},i

for(i=0i<20i++)

cout<<a[i]<<endl

sort(a,a+20)

for(i=0i<20i++)

cout<<a[i]<<endl

return 0

}

输出结果将是把斗桐数组a按升序排序。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12404081.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存