qsort 使用

合集下载

C语言之qsort函数详解

C语言之qsort函数详解

C语⾔之qsort函数详解⽬录⼀.qsort函数原型⼆.qsort常见的⼏种⽐较函数1.int类型的排序2.double类型的排序3.char类型的排序4.字符串的排序:1.按⾸字母排序2.按字符串长度排序:总结⼀.qsort函数原型qsort 功能: 使⽤快速排序例程进⾏排序,这个函数是根据⼆分法写的,其时间复杂度为n*log(n)#include<stdlib.h>void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *))各参数:1. 待排序数组⾸地址(可直接输⼊待排序数组名,或是指向数组的指针)2. 数组中待排序元素数量(可以⽤sizeof()来求)3. 各元素的占⽤空间⼤⼩(可以⽤sizeof(arr[0])来求)4. 指向函数的指针这个qsort需要我们⾃⼰创建⼀个⽐较函数,基本都是这个函数int cmp(const void* _a, const void* _b);⼆.qsort常见的⼏种⽐较函数1.int类型的排序int cmp(const void* _a, const void* _b){int* a = (int*)_a;int* b = (int*)_b;return *a-*b;}int main(){int num[10] = { 5,7,8,1,26,52,9,3,14,56 };int sz = sizeof(num) / sizeof(num[0]);qsort(num, sz, sizeof(num[0]), cmp);int i = 0;for (i = 0; i < sz; i++){printf("%d ", num[i]);}}*a-*b这个是从⼩到⼤排序,如果想从⼤到⼩排序就是*b-*a;升序排序结果图:降序排列:int cmp(const void* _a, const void* _b){int* a = (int*)_a;int* b = (int*)_b;return *b-*a;}int main(){int num[10] = { 5,7,8,1,26,52,9,3,14,56 };int sz = sizeof(num) / sizeof(num[0]);qsort(num, sz, sizeof(num[0]), cmp);int i = 0;for (i = 0; i < sz; i++){printf("%d ", num[i]);}}其实降序排序就是换成*b-*a降序排序效果图:2.double类型的排序int cmp(const void* _a, const void* _b){double* a = (double*)_a;double* b = (double*)_b;return *(double*)_a > *(double*)_b ? 1 : -1;;}int main(){double num[4] = { 2.1,5.2,3.2,445.2};int sz = sizeof(num) / sizeof(num[0]);qsort(num, sz, sizeof(num[0]), cmp);int i = 0;for (i = 0; i < sz; i++){printf("%.2f ", num[i]);}}double类型的⽐较特殊,因为返回值是int,所以如果是两个特别相近的浮点数相减,那么就有可能会出现的结果⽐-1⼤并且⽐1⼩,这样系统就会默认为0,所以这⾥使⽤了⼀个三⽬运算,⽤来⽐较。

qsort 用法

qsort 用法

qsort 用法qsort 是一个C库函数,用于对数组进行快速排序。

它可以按照特定的比较函数,对数组中的元素进行排序。

以下是关于 qsort 函数的一些用法:1. 函数原型:```cvoid qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *));```- base:指向待排序数组的首个元素的指针。

- nitems:待排序数组中元素的个数。

- size:每个元素的字节大小。

- compar:用户自定义的比较函数。

2. 比较函数的定义:比较函数用于定义排序的方式,它必须满足以下规则:- 如果第一个元素小于第二个元素,则返回一个负数。

- 如果第一个元素大于第二个元素,则返回一个正数。

- 如果两个元素相等,则返回零。

比较函数的原型如下:```cint compar(const void *a, const void *b);3. 示例用法:假设我们有一个整型数组,需要按从小到大的顺序进行排序。

下面是一个示例代码:```c#include <stdio.h>#include <stdlib.h>// 比较函数int compar(const void *a, const void *b) {return (*(int*)a - *(int*)b);}int main() {int arr[] = {9, 5, 2, 7, 1};int n = sizeof(arr) / sizeof(arr[0]);// 使用 qsort 对数组进行排序qsort(arr, n, sizeof(int), compar);// 打印排序后的数组for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}return 0;```输出结果:```1 2 5 7 9```在上面的示例中,我们首先定义了一个比较函数 `compar`,该函数按照从小到大的顺序对整数进行比较。

qsort函数在c语言中的含义

qsort函数在c语言中的含义

一、概述qsort函数是C语言标准库中的一个用于排序数组的函数。

它可以根据用户自定义的比较函数对数组进行排序,是C语言中非常常用的排序函数之一。

二、函数原型qsort函数的函数原型如下:void qsort(void *base, size_t nmemb, size_t size, int (par)(const void *, const void *));其中,参数说明如下:1. base:指向要排序的数组的指针。

2. nmemb:数组中元素的数量。

3. size:数组中每个元素的大小。

4.par:比较函数的指针,用于指定排序时的比较规则。

三、比较函数qsort函数的核心在于比较函数,比较函数的定义如下:intpar(const void* a, const void* b);比较函数接受两个参数a和b,分别指向待比较的数组元素。

比较函数需要根据实际需求编写,它应该按照排序的规则来比较a和b,并返回结果。

比较函数返回值的含义为:- 若a应排在b之前,则返回负值;- 若a应排在b之后,则返回正值;- 若a与b相等,则返回0。

四、函数用法使用qsort函数进行排序的一般步骤如下:1. 定义比较函par,根据排序需求编写比较规则。

2. 调用qsort函数进行排序,示例代码如下:```cintpare(const void* a, const void* b) {return *(int*)a - *(int*)b;}int m本人n() {int arr[] = {4, 2, 8, 5, 1};int len = sizeof(arr) / sizeof(arr[0]);qsort(arr, len, sizeof(int),pare);return 0;}```这段示例代码演示了如何使用qsort函数对整型数组进行升序排序。

五、注意事项在使用qsort函数时,需要注意以下几点:1. 比较函数的正确性和效率会直接影响排序结果和性能,因此需要仔细编写和测试比较函数。

C++排序函数sort(),qsort()的用法

C++排序函数sort(),qsort()的用法

C++排序函数sort(),qsort()的⽤法想起来⾃⼰天天排序排序,冒泡啊,⼆分查找啊,结果在STL中就⾃带了排序函数sort,qsort,总算把⾃⼰解脱了~所以⾃⼰总结了⼀下,⾸先看sort函数见下表:sort对给定区间所有元素进⾏排序stable_sort对给定区间所有元素进⾏稳定排序partial_sort对给定区间所有元素部分排序partial_sort_copy对给定区间复制并排序nth_element找出给定区间的某个位置对应的元素is_sorted判断⼀个区间是否已经排好序partition使得符合某个条件的元素放在前⾯stable_partition相对稳定的使得符合某个条件的元素放在前⾯要使⽤此函数只需⽤#include <algorithm> sort即可使⽤,语法描述为:sort(begin,end),表⽰⼀个范围,例如:int _tmain(int argc, _TCHAR* argv[]){int a[20]={2,4,1,23,5,76,0,43,24,65},i;for(i=0;i<20;i++)cout<<a[i]<<endl;sort(a,a+20);for(i=0;i<20;i++)cout<<a[i]<<endl;return 0;}输出结果将是把数组a按升序排序,说到这⾥可能就有⼈会问怎么样⽤它降序排列呢?这就是下⼀个讨论的内容.⼀种是⾃⼰编写⼀个⽐较函数来实现,接着调⽤三个参数的sort:sort(begin,end,compare)就成了。

对于list容器,这个⽅法也适⽤,把compare作为sort的参数就可以了,即:sort(compare).1)⾃⼰编写compare函数:bool compare(int a,int b){return a<b; //升序排列,如果改为return a>b,则为降序}int _tmain(int argc, _TCHAR* argv[]){int a[20]={2,4,1,23,5,76,0,43,24,65},i;for(i=0;i<20;i++)cout<<a[i]<<endl;sort(a,a+20,compare);for(i=0;i<20;i++)cout<<a[i]<<endl;return 0;}2)更进⼀步,让这种操作更加能适应变化。

qsort,sort排序

qsort,sort排序

C语言标准库函数qsort详解qsort包含在<stdlib.h>头文件中,此函数根据你给的比较条件进行快速排序,通过指针移动实现排序。

排序之后的结果仍然放在原数组中。

使用qsort函数必须自己写一个比较函数。

函数原型:void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );指向任意数据类型的指针都可以转换为void*类型用法以及参数说明:Sorts the num elements of the array pointed by base, each element size bytes long, using the comparator function to determine the order.The sorting algorithm used by this function compares pairs of values by calling the specified comparator function with two pointers to elements of the array.The function does not return any value, but modifies the content of the array pointed by base reordering its elements to the newly sorted order.base Pointer to the first element of the array to be sorted.(数组起始地址)num Number of elements in the array pointed by base.(数组元素个数)size Size in bytes of each element in the array.(每一个元素的大小)comparator Function that compares two elements.(函数指针,指向比较函数)1、The function must accept two parameters that are pointers to elements, type-casted as void*. These parameters should be cast back to some data type and be compared.2、The return value of this function should represent whether elem1 is considered less than, equal to, or greater than elem2 by returning, respectively, a negative value, zero or a positive value. Return Value none (无返回值)给你们的C++帮助文档上面的语法及定义是:语法:对buf指向的数据(包含num项,每项的大小为size)进行快速排序。

c语言qsort的使用

c语言qsort的使用

c语⾔qsort的使⽤⽬的基于快速排序对数组进⾏排序,数组元素可以是结构体。

前提qsort属于内置函数,需要包含头⽂件 stdlib.h函数原型void qsort( void *ptr, size_t count, size_t size,int (*comp)(const void *, const void *) );/**void *ptr:空指针, 指向需要排序的数组size_t count:数组元素个数,size_t在32位机器上unsigned int(4byte),64位机器上unsigned long(8byte)size:数组元素的字节数⼤⼩,通常⽤sizeof()来计算,平台不同,同⼀类型的变量占据的字节数可能不⽤,增强可移植性int (*comp)(const void *, const void *) : 函数指针,将函数名作为参数,该函数的形参的类型均为const void *,函数外表是⼀样的,内容却有所不同,返回值类型相同**/⽤户⾃定义函数指明具体的⽐较对象int cmp(const void *a, const void *b); // ⾃定义函数内容,若果a值⼤于b值,返回1,{/**在函数内部将const void* 转换成实际的类型;**///默认升序写法if ( *(MyType*)a < *(MyType*)b )return -1;if ( *(MyType*)a == *(MyType*)b )return 0;if ( *(MyType*)a > *(MyType*)b )return 1;}结构体排序struct Node {int x;}s[100];int cmp(const void *a, const void *b);{if ( (*(Node*)a)->x < (*(Node*)b)->x )return -1;if ( (*(Node*)a)->x == (*(Node*)b)->x )return 0;if ( (*(Node*)a)->x > (*(Node*)b)->x )return 1;}多级排序⽤于结构体内有多个成员时,当x相同时,⽐较y,以此类推即可。

qsort排序原理

qsort排序原理

qsort排序原理
qsort是一种快速排序算法,它的原理是通过递归将待排序的数组分成两个子数组,一个子数组的所有元素都小于另一个子数组的所有元素。

然后对两个子数组分别进行排序,最终将两个子数组合并起来得到有序的数组。

具体的原理如下:
1. 选择一个基准元素(通常是数组的第一个元素)。

2. 将所有小于基准元素的元素放在基准元素的左边,将所有大于基准元素的元素放在基准元素的右边,形成两个子数组。

3. 对两个子数组递归地重复步骤1和步骤2,直到子数组的长度为1或0。

4. 将两个子数组合并起来,得到最终排序的数组。

快速排序的关键在于如何选择基准元素和如何将元素重新排列。

一种常用的选择基准元素的方法是取数组的第一个元素,然后通过比较将小于它的元素放到它的左边,将大于它的元素放到它的右边。

这样,基准元素就被放置在了它最终的位置上。

然后对左右两个子数组分别重复这个过程,直到子数组的长度为1或0。

快速排序的时间复杂度为O(nlogn),其中n是待排序的数组长度。

这是因为每次递归将数组划分成两个大小大致相等的子数组,而对这两个子数组的排序都可以通过递归实现。

所以,每次递归的时间复杂度是O(n),一共需要递归logn次,
所以总的时间复杂度是O(nlogn)。

qsort排序函数

qsort排序函数

qsort排序函数qsort函数是C语言标准库中的一个函数,用于对数组进行快速排序。

它的原型为:void qsort(void base, size_t num, size_t size, int (compar)(const void , const void ));参数解释:void base,指向要排序的数组的指针。

size_t num,数组中的元素个数。

size_t size,数组中每个元素的大小(以字节为单位)。

int (compar)(const void , const void ),指向比较函数的指针。

比较函数的原型为:int compar(const void a, const void b);qsort函数使用快速排序算法对数组进行排序。

快速排序是一种高效的排序算法,它通过递归地将数组分成较小的子数组,然后对子数组进行排序以实现整体的排序。

在实际使用中,可以根据具体的需求编写比较函数,以指定排序的规则。

使用qsort函数时需要注意以下几点:1. 确保比较函数的正确性,比较函数需要满足传递性、反对称性和传递性的要求,否则排序结果可能不正确。

2. 确保数组指针和元素大小的正确性,传递给qsort函数的数组指针和元素大小需要正确,否则可能导致未定义的行为。

3. 注意内存管理,在使用qsort函数时,需要注意数组内存的分配和释放,以避免内存泄漏和越界访问等问题。

总之,qsort函数是C语言中用于对数组进行快速排序的标准库函数,通过合理编写比较函数和正确传递参数,可以实现对数组的高效排序。

在实际应用中,需要注意算法的稳定性、性能和内存管理等方面的问题,以确保排序的正确性和效率。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最近用到了qsort,简单整理一下,方便以后的查找qsort,包含在stdlib.h头文件里,函数一共四个参数,没返回值.一个典型的qsort的写法如下qsort(s,n,sizeof(s[0]),cmp);其中第一个参数是参与排序的数组名(或者也可以理解成开始排序的地址,因为可以写&s[i] 这样的表达式,这个问题下面有说明); 第二个参数是参与排序的元素个数; 第三个三数是单个元素的大小,推荐使用sizeof(s[0])这样的表达式,下面也有说明:) ;第四个参数就是很多人觉得非常困惑的比较函数啦,关于这个函数,还要说的比较麻烦...我们来讨论cmp这个比较函数(写成cmp是我的个人喜好,你可以随便写成什么,比如qcmp 什么的).典型的cmp的定义是int cmp(const void *a,const void *b);返回值必须是int,两个参数的类型必须都是const void *,那个a,b是我随便写的,个人喜好.假设是对int排序的话,如果是升序,那么就是如果a比b大返回一个正值,小则负值,相等返回0,其他的依次类推,后面有例子来说明对不同的类型如何进行排序.在函数体内要对a,b进行强制类型转换后才能得到正确的返回值,不同的类型有不同的处理方法.具体情况请参考后面的例子.** 关于快排的一些小问题**1.快排是不稳定的,这个不稳定一个表现在其使用的时间是不确定的,最好情况(O(n))和最坏情况(O(n^2))差距太大,我们一般说的O(nlog(n))都是指的是其平均时间.2.快排是不稳定的,这个不稳定表现在如果相同的比较元素,可能顺序不一样,假设我们有这样一个序列,3,3,3,但是这三个3是有区别的,我们标记为3a,3b,3c,快排后的结果不一定就是3a,3b,3c这样的排列,所以在某些特定场合我们要用结构体来使其稳定(No.6的例子就是说明这个问题的)3.快排的比较函数的两个参数必须都是const void *的,这个要特别注意,写a和b只是我的个人喜好,写成cmp也只是我的个人喜好.推荐在cmp里面重新定义两个指针来强制类型转换,特别是在对结构体进行排序的时候4.快排qsort的第三个参数,那个sizeof,推荐是使用sizeof(s[0])这样,特别是对结构体,往往自己定义2*sizeof(int)这样的会出问题,用sizeof(s[0)既方便又保险5.如果要对数组进行部分排序,比如对一个s[n]的数组排列其从s[i]开始的m个元素,只需要在第一个和第二个参数上进行一些修改:qsort(&s[i],m,sizeof(s[i]),cmp);** 标程,举例说明**No.1.手工实现QuickSort#include <stdio.h>int a[100],n,temp;void QuickSort(int h,int t){if(h>=t) return;int mid=(h+t)/2,i=h,j=t,x;x=a[mid];while(1){while(a[i]<x) i++;while(a[j]>x) j--;if(i>=j) break;temp=a[i];a[i]=a[j];a[j]=temp;}a[mid]=a[j];a[j]=x;QuickSort(h,j-1);QuickSort(j+1,t);return;}int main(){int i;scanf("%d",&n);for(i=0;i<n;i++) scanf("%d",&a[i]);QuickSort(0,n-1);for(i=0;i<n;i++) printf("%d ",a[i]);return(0);}No.2.最常见的,对int数组排序#include <stdio.h>#include <string.h>#include <stdlib.h>int s[10000],n,i;int cmp(const void *a, const void *b){return(*(int *)a-*(int *)b);}int main(){scanf("%d",&n);for(i=0;i<n;i++) scanf("%d",&s[i]);qsort(s,n,sizeof(s[0]),cmp);for(i=0;i<n;i++) printf("%d ",s[i]);return(0);}No.3.对double型数组排序,原理同int这里做个注释,本来是因为要判断如果a==b返回0的,但是严格来说,两个double数是不可能相等的,只能说fabs(a-b)<1e-20之类的这样来判断,所以这里只返回了1和-1#include <stdio.h>#include <stdlib.h>double s[1000];int i,n;int cmp(const void * a, const void * b){return((*(double*)a-*(double*)b>0)?1:-1);}int main(){scanf("%d",&n);for(i=0;i<n;i++) scanf("%lf",&s[i]);qsort(s,n,sizeof(s[0]),cmp);for(i=0;i<n;i++) printf("%lf ",s[i]);return(0);}No.4.对一个字符数组排序.原理同int#include <stdio.h>#include <string.h>#include <stdlib.h>char s[10000],i,n;int cmp(const void *a,const void *b){return(*(char *)a-*(char *)b);}int main(){scanf("%s",s);n=strlen(s);qsort(s,n,sizeof(s[0]),cmp);printf("%s",s);return(0);}No.5.对结构体排序注释一下.很多时候我们都会对结构体排序,比如校赛预选赛的那个樱花,一般这个时候都在cmp函数里面先强制转换了类型,不要在return里面转,我也说不清为什么,但是这样程序会更清晰,并且绝对是没错的. 这里同样请注意double返回0的问题#include <stdio.h>#include <stdlib.h>struct node{double date1;int no;} s[100];int i,n;int cmp(const void *a,const void *b){struct node *aa=(node *)a;struct node *bb=(node *)b;return(((aa->date1)>(bb->date1))?1:-1);}int main(){scanf("%d",&n);for(i=0;i<n;i++){s[i].no=i+1;scanf("%lf",&s[i].date1);}qsort(s,n,sizeof(s[0]),cmp);for(i=0;i<n;i++) printf("%d %lf\n",s[i].no,s[i].date1);return(0);}No.6.对结构体排序.加入no来使其稳定(即data值相等的情况下按原来的顺序排) #include <stdio.h>#include <stdlib.h>struct node{double date1;int no;} s[100];int i,n;int cmp(const void *a,const void *b){struct node *aa=(node *)a;struct node *bb=(node *)b;if(aa->date1!=bb->date1)return(((aa->date1)>(bb->date1))?1:-1);elsereturn((aa->no)-(bb->no));}int main(){scanf("%d",&n);for(i=0;i<n;i++){s[i].no=i+1;scanf("%lf",&s[i].date1);}qsort(s,n,sizeof(s[0]),cmp);for(i=0;i<n;i++) printf("%d %lf\n",s[i].no,s[i].date1);return(0);}No.7.对字符串数组的排序(char s[][]型)#include <stdio.h>#include <string.h>#include <stdlib.h>char s[100][100];int i,n;int cmp(const void *a,const void *b){return(strcmp((char*)a,(char*)b));}int main(){scanf("%d",&n);for(i=0;i<n;i++) scanf("%s",s[i]);qsort(s,n,sizeof(s[0]),cmp);for(i=0;i<n;i++) printf("%s\n",s[i]);return(0);}No.8.对字符串数组排序(char *s[]型)#include <stdio.h>#include <string.h>#include <stdlib.h>char *s[100];int i,n;int cmp(const void *a,const void *b){return(strcmp(*(char**)a,*(char**)b));}int main(){scanf("%d",&n);for(i=0;i<n;i++){s[i]=(char*)malloc(sizeof(char*));scanf("%s",s[i]);}qsort(s,n,sizeof(s[0]),cmp);for(i=0;i<n;i++) printf("%s\n",s[i]);return(0);}/////////////////////////////////////////////////////////////////////////////////#include<iostream>#include <stdlib.h>using namespace std;int Comp(const void *p1,const void *p2){return *((int *)p2) - *((int *)p1);}int main(){int a[50],n,i;while(cin>>n){for(i=0;i<n;i++)cin>>a[i];qsort(a,n,sizeof(a[0]),Comp);for(i=0;i<n;i++)cout<<a[i]<<" ";}}/*六类qsort排序方法前一段时间做题觉得qsort函数很好用,但有时不太会用比如按结构体一级排序、二级排序、字符串排序等,故通过查资料将其整理一番。

相关文档
最新文档