700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【C语言】快速排序函数qsort()

【C语言】快速排序函数qsort()

时间:2023-11-25 16:07:01

相关推荐

【C语言】快速排序函数qsort()

快速排序函数

函数原型各种数据类型的升序排序函数1. 整型2. double型3. 字符排序4. 字符串排序1. 根据字符串首字母排序2. 根据字符串长度排序3. 按字典排序字符串。5. 结构体1.一级排序2.二级排序具体样例1. 整型2.double型3.字符型4.字符串5.结构体

函数原型

#include<stdlib.h>void qsort(void*, size_t, size_t, int ( * )(const void * , const void * ))

第一个参数为待排序数组首地址。

可直接输入待排序数组名,或是指向数组的指针。

第二个参数为数组长度。

size_t是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。

可以直接输入待排序的数组的长度。

第三个参数为数组元素所占字节。

可直接用sizeof(a[0])计算字数组单个元素的节数。

第四个参数为所调用函数的指针,函数名即是函数的指针,可直接写函数名,调用函数用来确定排序的方式。

先以整型递增排序为例

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

int inc 表示函数返回一个int值。inc为函数名 ,表示递增排序(increase),也可以自己命名。( const void * a, const void * b)将两个要对比的元素的地址传入函数。 (加const表示无法改变指针指向的值)return * ( int * )a - * ( int * ) b ,返回一个整型数,表示两个元素对比的结果。如果a大于b,则返回正数。a小于b,则返回负数。如果a等于b,则返回零。(int *)表示将地址强制类型转换成整形地址类型,可根据排序对象选择指针类型的转换。也可以改变算式,例如用 return strlen((char * )a) > strlen((char * )b) ? 1 : -1; 可以返回比较字符串长度的结果,用来根据字符串长度进行排序, 下面有相关的代码。

各种数据类型的升序排序函数

(如果要降序排序,只需将return里的a,b反过来写即可。)

1. 整型

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

2. double型

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

注: 这里两个浮点数相减但要返回一个整型数,如果按上面做法直接减会丢失小数点部分。所以需另加处理,直接判断大小,如果a大于b,则返回1,否则返回-1。

3. 字符排序

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

4. 字符串排序

char am = {{"...."}, {"....."}, .....};qsort(a, m, sizeof(char * ) * n, inc);

1. 根据字符串首字母排序

```cint inc(const void *a, const void *b) { return * (char *)a - *(char * )b; } ```

2. 根据字符串长度排序

```cint inc(const void *a, const void *b) { return strlen((char * )a) > strlen((char * )b) ? 1 : -1; } ```

注:这里不要用 return strlen((char * )a) - strlen((char * )b) ;

原因:

1. strlen返回类型为size_t,size_t是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。无符号整型最好不要做四则运算。

2. 这里虽然函数返回int型,会把无符号数转换为整型,但返回结果只在字符串的长度未超过int的范围时正确。这种大范围转小范围要考虑精度损失的问题。

3. 按字典排序字符串。

```cint inc(const void *a, const void *b){return (strcmp((char *)a, (char *)b));}```

5. 结构体

struct node{double one;int two;} s[100];

1.一级排序

根据double型的one的大小排序结构体。

int inc( const void *a ,const void *b){return ( * (node * )a).one > ( * (node * )b).one ? 1 : -1;}

2.二级排序

先根据double型的one的大小排序,若两值相等,在根据int型two的大小排序。

int inc( const void *a , const void *b ){if((* (node * )a).one != ( * (node * )b).one)return ( * (node * )a).one > ( * (node * )b).one ? 1 : -1;else return (* (node * )a).two -( * (node * )b).two;}

具体样例

1. 整型

#include<stdio.h>#include<stdlib.h>#define L 20int inc(const void *a, const void *b){return *(int *)a - *(int *)b;} int main (){int a[L] = {0, 5, 2, 3, 4, 9, 8, 7, 6, 1,11, 15, 14, 12, 13, 16, 17, 18, 19, 10};qsort(a, L, sizeof(int), inc);for (int i = 0; i < L; i++){printf("%d ", a[i]);}}

2.double型

#include<stdio.h>#include<stdlib.h>#define L 20int inc(const void *a, const void *b){return *(double *)a > *(double *)b? 1 : -1;} int main (){double a[L] = {0.1, 0.11, 1.1, 1.5, 1.8, 1.51, 2.5, 2.9, 1.3, 0.8, 15.5, 7.9, 8.5, 8.51, 8.6, 3, 1.41, 1.11, 1.51, 2};qsort(a, L, sizeof(double), inc);for (int i = 0; i < L; i++){printf("%.2lf\n", a[i]);}}

运行结果 :

3.字符型

#include<stdio.h>#include<stdlib.h>#define L 20int inc(const void *a, const void *b){return *(char *)a - *(char *)b;} int main (){char a[L] = {'q', 'w', 'r', 'h', 'a', 'v', 'g', 'e', 'b', 'l','o', 'p', 'u', 'y', 't', 'c', 'x', 'i', 'z', 's'};qsort(a, L, sizeof(char), inc);for (int i = 0; i < L; i++){printf("%c ", a[i]);}}

运行结果 :

4.字符串

按首字母排序

#include<stdio.h>#include<stdlib.h>#define L 10#define K 10int inc(const void *a, const void *b){return *(char *)a - *(char *)b;} int main (){char a[L][K] = {"rbsc","jcse","efgd","arbs","bbs","cbfe","dgafg" ,"ewqrta","ofgd","mbcv",};qsort(a, L, sizeof(char) * K, inc);for (int i = 0; i < L; i++){printf("%s\n", a[i]);}}

运行结果 :

按长度排序

#include<stdio.h>#include<stdlib.h>#include<string.h>#define L 10#define K 10int inc(const void *a, const void *b){return strlen((char *)a) > strlen((char *)b) ? 1 : -1;} int main (){char a[L][K] = {"rbsc","jcsse","efgdsd","arbs","bbs","cbfefaa","dgafg" ,"ewqrta","ofgd","mbcv312",};qsort(a, L, sizeof(char) * K, inc);for (int i = 0; i < L; i++){printf("%s\n", a[i]);}}

运行结果 :

3. 按字典顺序

#include<stdio.h>#include<stdlib.h>#include<string.h>#define L 10#define K 10int inc(const void *a, const void *b){return strcmp((char * )a, (char *)b);} int main (){char a[L][K] = {"rbsc","jcsse","afgdsd","arbs","abs","cbfefaa","cgafg" ,"ewqrta","ofgd","mbcv312",};qsort(a, L, sizeof(char) * K, inc);for (int i = 0; i < L; i++){printf("%s\n", a[i]);}}

运行结果:

5.结构体

结构体二级排序

#include<stdio.h>#include<stdlib.h>#include<string.h>#define L 10typedef struct node {double first;int numb;}node;int inc(const void *a, const void *b){if((* (node *)a).first != ( * (node *)b).first)return ( * (node * )a).first > ( * (node * )b).first ? 1 : -1;else return (* (node * )a).numb -( * (node * )b).numb;} int main (){node arr[L] = {1.0, 1,2.0, 2,1.1, 3,2.1, 4,3.5, 5,1.0, 6,1.1, 7,5.1, 8,5.0, 9,3.6, 10,};qsort(arr, L, sizeof(node), inc);for (int i = 0; i < L; i++){printf("%.2lf %d\n", arr[i].first, arr[i].numb);}}

运行结果:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。