qsort排序
qsort快速排序的整理
qsort快速排序的整理最近⽤到了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函数很好⽤,但有时不太会⽤⽐如按结构体⼀级排序、⼆级排序、字符串排序等,故通过查资料将其整理⼀番。
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. 比较函数的正确性和效率会直接影响排序结果和性能,因此需要仔细编写和测试比较函数。
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)进行快速排序。
qsort的用法
qsort的用法
qsort是C语言中的一个函数,用于对数组元素进行排序。
它的用法可以参考下面的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
return *(int*)a - *(int*)b;
}
int main() {
int arr[] = { 4, 2, 8, 0, 5, 7, 1, 3, 9, 6 };
int n = sizeof(arr) / sizeof(arr[0]);
qsort(arr, n, sizeof(int), compare);
for (int i = 0; i < n; i++) {
printf('%d ', arr[i]);
}
return 0;
}
```
在该代码中,我们定义了一个整数数组arr,它包含10个随机值。
然后我们调用qsort来对数组进行排序。
qsort需要四个参数:要排序的数组的起始地址,数组中元素的数量,每个元素的字节数,
以及一个比较函数。
比较函数是用来比较数组元素的大小的,它需要接受两个指向数组元素的指针,并返回一个整数值,表示它们的相对大小。
在上面的示例中,我们定义了一个名为compare的比较函数,它将两个整数指针转换为整数,并返回它们的差值。
这个函数用在qsort函数中,以决定数组元素的顺序。
最后,我们使用for 循环打印排好序的数组。
qsort排序原理
qsort排序原理
qsort是一种快速排序算法,它的原理是通过递归将待排序的数组分成两个子数组,一个子数组的所有元素都小于另一个子数组的所有元素。
然后对两个子数组分别进行排序,最终将两个子数组合并起来得到有序的数组。
具体的原理如下:
1. 选择一个基准元素(通常是数组的第一个元素)。
2. 将所有小于基准元素的元素放在基准元素的左边,将所有大于基准元素的元素放在基准元素的右边,形成两个子数组。
3. 对两个子数组递归地重复步骤1和步骤2,直到子数组的长度为1或0。
4. 将两个子数组合并起来,得到最终排序的数组。
快速排序的关键在于如何选择基准元素和如何将元素重新排列。
一种常用的选择基准元素的方法是取数组的第一个元素,然后通过比较将小于它的元素放到它的左边,将大于它的元素放到它的右边。
这样,基准元素就被放置在了它最终的位置上。
然后对左右两个子数组分别重复这个过程,直到子数组的长度为1或0。
快速排序的时间复杂度为O(nlogn),其中n是待排序的数组长度。
这是因为每次递归将数组划分成两个大小大致相等的子数组,而对这两个子数组的排序都可以通过递归实现。
所以,每次递归的时间复杂度是O(n),一共需要递归logn次,
所以总的时间复杂度是O(nlogn)。
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语言中用于对数组进行快速排序的标准库函数,通过合理编写比较函数和正确传递参数,可以实现对数组的高效排序。
在实际应用中,需要注意算法的稳定性、性能和内存管理等方面的问题,以确保排序的正确性和效率。
c qsort函数
c qsort函数C语言是一种习惯使用数组的编程语言,在操作数组时,排序无疑是一个非常重要的操作。
在C语言中,有一个非常方便的函数可以用来实现排序的操作,那就是qsort函数。
本文将围绕qsort函数,为大家详细讲解它的原理以及具体用法。
一、qsort函数的原理qsort函数的原理很简单,就是使用快速排序算法来对数组进行排序,快排这种算法最大的优点就是速度非常快,并且在实际操作中对于大多数数据集都能得到很好的效果。
二、qsort函数的具体用法qsort函数的具体用法如下:void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));参数说明:1.base:要排序的数组的第一个元素的指针。
2.nmemb:要排序的数组的元素个数。
3.size:数组中每个元素的大小,即每个元素占用的字节数。
par:指向两个元素比较函数的指针。
其中,第四个参数是一个指向两个元素比较函数的指针。
这个函数的作用就是对两个元素进行比较,如果第一个元素应该排在第二个元素之前,则返回一个负数;如果两个元素相等,则返回0;如果第一个元素应该排在第二个元素之后,则返回一个正数。
下面是一个比较简单的例子:#include<stdio.h>#include<stdlib.h>int compare(const void *a, const void *b){return (*(int*)a - *(int*)b);}int main(){int arr[] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };int n = sizeof(arr) / sizeof(arr[0]);qsort(arr, n, sizeof(int), compare);printf("Sorted array: ");for (int i = 0; i < n; i++)printf("%d ", arr[i]);return 0;}这个例子中,首先定义了一个整型数组,然后定义了一个compare函数,用来比较两个元素的大小。
qsort的七种排序方法
//按照x从小到大排序,当x相等时按照y从大到小排序 Sample: 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); 六、对字符串进行排序 struct In { int data; char str[100]; }s[100]; //按照结构体中字符串str的字典顺序排序 Sample: int cmp ( const void *a , const void *b ) { return strcmp( ((In *)a)->str , ((In *)b)->str ); } qsort(s,100,sizeof(s[0]),cmp); 七、计算几何中求凸包的cmp //重点cmp函数,把除了1点外的所有点,旋转角度排序 int cmp(const void *a,const void *b) { 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; } PS: 其中的qsort函数包含在<stdlib.h>的头文件里,strcmp包含在<string.h>的头文件里.
qsort函数的用法
qsort函数的用法一、qsort函数的概述qsort函数是C语言中的标准库函数,用于对数组进行快速排序。
它可以按照用户定义的比较函数将数组元素排序,并且具有较高的效率和灵活性。
二、qsort函数的语法qsort函数的语法如下:```void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));```其中,参数解释如下:- base:要排序的数组首元素地址。
- nmemb:要排序的元素个数。
- size:每个元素的大小。
- compar:比较函数指针,用于确定元素之间的大小关系。
三、qsort函数的使用步骤使用qsort函数进行数组排序需要以下步骤:1. 定义一个比较函数,用于确定元素之间的大小关系。
2. 调用qsort函数进行数组排序。
四、定义比较函数比较函数是一个用户自己定义的用于确定元素之间大小关系的函数。
它接收两个参数,分别为待比较元素a和b,返回值为整型。
比较函数需要满足以下条件:1. 如果a小于b,则返回负数。
2. 如果a等于b,则返回0。
3. 如果a大于b,则返回正数。
例如,如果要对一个int类型数组进行升序排列,则可以定义如下比较函数:```int cmp(const void *a, const void *b) {return (*(int*)a - *(int*)b);}```五、调用qsort函数进行数组排序调用qsort函数进行数组排序需要传入以下参数:1. 要排序的数组首元素地址。
2. 要排序的元素个数。
3. 每个元素的大小。
4. 比较函数指针。
例如,对一个int类型数组进行升序排列,可以使用以下代码:```int arr[] = {5, 3, 1, 2, 4};int n = sizeof(arr) / sizeof(arr[0]);qsort(arr, n, sizeof(int), cmp);```六、注意事项1. qsort函数只能对内存中的数据进行排序,不能对文件中的数据进行排序。
qsort 用法 -回复
qsort 用法-回复QSort是一种常见的排序算法,也称为快速排序。
它是一种分治策略的排序算法,通常比较高效,在实践中被广泛使用。
以下是一篇关于QSort用法的1500-2000字文章,逐步回答。
QSort是一种基于比较的内部排序算法,在大多数情况下运行时间是O(nlogn)。
它通过将数组分成较小的子数组并逐步排序这些子数组来工作。
QSort的名字来自于它的排序过程中,快速地将数组分割成两个部分。
首先我们需要了解一些基本概念。
在排序算法中,我们需要比较元素的大小,这可以通过元素之间的某种关系来实现,例如元素可以是数字、字符串或其他可比较的对象。
在QSort中,我们使用一个称为“比较器”的函数来确定元素之间的比较方式。
使用QSort进行排序的第一步是选择一个称为“主元”的元素。
该元素将在排序过程中作为参考值,其他元素将与它进行比较和排序。
通常情况下,我们选择数组的第一个或最后一个元素作为主元,但也可以选择其他元素。
选择主元的方式对算法的性能有一定的影响。
一旦选择了主元,我们将数组分为两个部分,同时建立两个指针。
第一个指针从数组的左侧开始,往右扫描数组,找到一个大于或等于主元的元素。
第二个指针从数组的右侧开始,往左扫描数组,找到一个小于或等于主元的元素。
这样,我们得到了两个指针指向的元素,它们需要在排序后的数组中交换位置。
一旦指针交汇,我们就可以确定主元在排序后数组的位置。
将主元元素放置在这个位置,并分别对主元的左侧和右侧进行递归排序。
这个过程叫做快速排序的分割阶段。
递归排序的基本思想是,如果一个数组可以正确地排序并且可以将它分成两个较小的数组进行排序,那么整个数组也可以正确地排序。
这种思想被称为分治策略。
在QSort中,我们将数组分割成两个较小的子数组,并分别对它们进行排序。
在递归过程中,我们继续选择主元并分割数组,直到只剩下一个元素或者子数组为空。
当数组只剩下一个元素时,我们可以认为它已经被排序了。
c语言默认的排序算法
c语言默认的排序算法C语言默认的排序算法在计算机科学中,排序算法是一种将一组数据按照特定顺序进行排列的方法。
排序算法是程序设计中非常重要的基础算法之一,也是入门级别的经典算法之一。
C语言作为一种广泛应用的编程语言,自带了一种默认的排序算法,即库函数中提供的qsort()函数。
qsort()函数是C语言中用于排序的库函数,其原型如下:```cvoid qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *));```参数解释:- base:指向要排序的数组的第一个元素的指针。
- num:数组中的元素个数。
- size:每个元素的大小,以字节为单位。
- compar:用于比较两个元素的函数指针。
使用qsort()函数进行排序的步骤如下:1. 定义一个待排序的数组。
2. 定义一个比较函数,用于指定排序的规则。
4. 输出排序后的结果。
下面通过一个示例来演示使用C语言默认的排序算法qsort()函数进行排序的过程。
```c#include <stdio.h>#include <stdlib.h>// 比较函数,用于指定排序规则(升序)int compare(const void *a, const void *b) {return (*(int*)a - *(int*)b);}int main() {int arr[] = {9, 5, 7, 2, 4, 1, 8, 3, 6};int n = sizeof(arr) / sizeof(arr[0]);printf("排序前的数组:");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");qsort(arr, n, sizeof(int), compare);printf("排序后的数组:");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;}```运行结果:```排序前的数组:9 5 7 2 4 1 8 3 6排序后的数组:1 2 3 4 5 6 7 8 9```在以上示例中,首先定义了一个待排序的数组arr,然后定义了一个比较函数compare,该函数用于指定排序的规则,这里使用的是升序排序。
c语言 qsort 用法
qsort 是C 语言标准库中的一个函数,用于对数组进行排序。
它的函数原型如下:void qsort(void* base, size_t num, size_t size, int (*compar)(const void*, const void*));其中,base 是数组的基址,num 是数组中元素的个数,size 是每个元素占用的字节数,compar 是比较函数,用于指定排序的方式。
qsort 函数的排序方式是冒泡排序,其具体实现过程如下:1. 从数组的第一个元素开始,依次比较相邻的两个元素的大小;2. 如果前一个元素比后一个元素大,则交换这两个元素的位置;3. 重复上述操作,直到数组全部排序完成。
compar 函数用于指定排序的方式,其函数原型如下:int compar(const void* a, const void* b);其中,a 和 b 分别指向数组中的两个元素,compar 函数返回值为一个整数,如果 a 小于b,则返回一个负整数;如果a 等于b,则返回0;如果a 大于b,则返回一个正整数。
下面是一个简单的例子,演示如何使用qsort 函数对数组进行排序:#include <stdio.h>#include <stdlib.h>int main() {int arr[] = { 6, 2, 9, 7, 1, 5, 3 };int i, num = sizeof(arr) / sizeof(arr[0]);// 使用qsort 函数对数组进行排序qsort(arr, num, sizeof(int), (int (*)(const void*, const void*))compar);printf("排序后的数组为:");for (i = 0; i < num; i++) {printf("%d ", arr[i]);}printf("\n");return 0;}// 比较函数int compar(const void* a, const void* b) {return (*(int*)a - *(int*)b);}在上面的代码中,我们定义了一个数组arr,然后使用qsort 函数对数组进行排序,指定比较函数为compar。
快排函数qsort
快排函数qsort功能: 使用快速排序例程进行排序用法: void qsort ( void *base , int nelem, int width, int (*fcmp)(const void *,const void *)); 各参数:1 待排序数组首地址2 数组中待排序元素数量3 各元素的占用空间大小4 指向函数的指针,用于确定排序的顺序说明: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的例子就是说明这个问题的。
c语言 函数中使用嵌套qsort函数
C语言中函数中使用嵌套qsort函数1. qsort函数简介qsort是C语言标准库中的一个非常实用的排序函数,用于对数组进行排序。
该函数的主要特点是它使用了快速排序算法,并允许用户自定义比较函数来决定排序的顺序。
qsort函数的原型如下:void qsort(void*base, size_t nitems, size_t size, int (*compar)(const void*, const void*));其中:base是指向要排序的数组的指针。
nitems是数组中的元素个数。
size是数组中每个元素的大小(以字节为单位)。
compar是一个比较函数,用于决定排序的顺序。
2. 嵌套qsort函数的使用场景在某些情况下,我们需要对嵌套数组或者结构体数组进行排序。
这时,我们可以使用嵌套的qsort函数来达到目的。
嵌套的qsort函数可以让我们对数组中的每个元素进行排序,从而实现多维度的排序。
3. 如何实现嵌套的qsort函数实现嵌套的qsort函数,需要我们提供两个比较函数。
外层qsort函数的比较函数决定了外层元素的排序顺序,而内层qsort函数的比较函数决定了内层元素的排序顺序。
在比较函数中,我们可以使用指针参数来访问嵌套的数组或结构体。
4. 示例代码下面是一个使用嵌套qsort函数的示例代码,用于对二维整数数组进行排序:#include<stdio.h>#include<stdlib.h>// 比较函数1,用于决定外层数组元素的排序顺序int compare1(const void*a, const void*b) {int*p1 = (int*)a;int*p2 = (int*)b;return*p1 -*p2; // 根据外层元素的值进行排序}// 比较函数2,用于决定内层数组元素的排序顺序int compare2(const void*a, const void*b) {int*p1 = (int*)a;int*p2 = (int*)b;return*p1 -*p2; // 根据内层元素的值进行排序}int main() {int arr[6][3] = {{5, 2, 9}, {1, 5, 6}, {7, 3, 8}, {4, 0, 2}, {3, 8, 1}, {0, 6, 4}};int n =sizeof(arr) /sizeof(arr[0]); // 外层数组元素个数int size =sizeof(arr[0]) /sizeof(int); // 内层数组元素个数qsort(arr, n, size *sizeof(int), compare1); // 外层排序,使用compare1比较函数for (int i =0; i < n; i++) { // 输出外层排序后的结果qsort(arr[i], size, sizeof(int), compare2); // 内层排序,使用compare2比较函数for (int j =0; j < size; j++) { // 输出内层排序后的结果printf("%d ", arr[i][j]); // 输出内层元素的值}printf("\n"); // 每行输出一个内层数组的结果}return0;}在上面的示例代码中,我们首先定义了两个比较函数compare1和compare2,分别用于决定外层和内层的排序顺序。
qsort(),sort()排序函数
qsort(),sort()排序函数⼀.qsort()函数功能:使⽤快速排序例程进⾏排序头⽂件:stdlib.h⽤法:void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));参数:1待排序数组⾸地址2数组中待排序元素数量3 各元素的占⽤空间⼤⼩4指向函数的指针,⽤于确定排序的顺序qsort(即,quicksort)主要根据你给的⽐较条件给⼀个快速排序,主要是通过指针移动实现排序功能。
排序之后的结果仍然放在原来数组中。
其中qsort和compare的⽤法如下:void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )int compare (const void *elem1, const void *elem2 ) ;1、对int类型数组排序compare函数:int compare(const void *a , const void *b ){return *(int *)a - *(int *)b; //升序排序//return *(int *)b - *(int *)a; //降序排序/*可见:参数列表是两个空指针,现在他要去指向你的数组元素。
所以转型为你当前的类型,然后取值。
升序排列时,若第⼀个参数指针指向的“值”⼤于第⼆个参数指针指向的“值”,则返回正;若第⼀个参数指针指向的“值”等于第⼆个参数指针指向的“值”,则返回零;若第⼀个参数指针指向的“值”⼩于第⼆个参数指针指向的“值”,则返回负。
降序排列时,则刚好相反。
*/}测试实例:#include<iostream>#include<stdlib.h>using namespace std;int compare(const void *a,const void *b){return *(int*)b-*(int*)a; //降序排列}int main(){int a[ ]={2,4,1,23,5,76,0,43,24,65};int i;int length = sizeof(a)/sizeof(int);for(i=0;i<length;i++)cout<<a[i]<<" ";cout<<endl;qsort(a,length,sizeof(int),compare);for(i=0;i<length;i++)cout<<a[i]<<" ";cout<<endl;return 0;}2.对char类型数组排序(同int类型)char word[100];//注意,⽹上很多版本是 “ return *(char *)a - *(int *)b; ”//注意: *(int *)b是错误的⽤法//应该是return *(char *)a - *(char *)b;return *(char *)a - *(char *)b;}qsort(word,100,sizeof(word[0]),compare);3.对double类型数组排序double in[100];int compare( const void *a , const void *b ){return *(double *)a > *(double *)b ? 1 : -1;//返回值的问题,显然compare返回的是⼀个整型,所以避免double返回⼩数⽽被丢失,⽤⼀个判断返回值。
qsort用法
qsort⽤法qsort包含在<stdlib.h>头⽂件中,此函数根据你给的⽐较条件进⾏快速排序,通过指针移动实现排序。
排序之后的结果仍然放在原数组中。
使⽤qsort函数必须⾃⼰写⼀个⽐较函数。
函数原型void qsort(void *base, size_t nelem, size_t width, int (*Comp)(const void *,const void *));函数⼀共四个参数,没返回值。
⼀个典型的qsort的写法如下:void 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的例⼦就是说明这个问题的)。
qsort函数排序各种类型的数据。
qsort函数排序各种类型的数据。
qsort函数是库函数中的⼀员,我们先来看看官⽅⽂档是怎么写的:其中qsort的参数void* base是传⼊⼀个数组,size_t num 为数组整体⼤⼩,size_t size 为单个元素的⼤⼩,int (*compar) (const void*,const void*)是需要使⽤者去完成的⼀个⽐较函数针对这个函数,在不同类型的数组中需要⽤不同的处理⽅式,来保证数组中的元素⼤⼩不会失真(例如在处理double型的数组时就需要⽤不同的⽅式来进⾏)⽐较函数的返回值是;return value meaning<0The element pointed to by p1 goes before the element pointed to by p20The element pointed to by p1 is equivalent to the element pointed to by p2>0The element pointed to by p1 goes after the element pointed to by p2我们来看⼀个例⼦:这是官⽅⽂档为我们提供的⼀个例⼦:关于对 qsort 的使⽤1/* qsort example */2 #include <stdio.h> /* printf */3 #include <stdlib.h> /* qsort */45int values[] = { 40, 10, 100, 90, 20, 25 };67int compare (const void * a, const void * b)8 {9return ( *(int*)a - *(int*)b );10 }1112int main ()13 {14int n;15 qsort (values, 6, sizeof(int), compare);16for (n=0; n<6; n++)17 printf ("%d ",values[n]);18return0;19 }1.对 int 类型的数组排序1//qsort函数2 #include <stdio.h>3 #include<stdlib.h>4//qsort函数实现int型排序5//qosrt函数的使⽤者得实现⼀个⽐较函数6int int_cmp(const void * p1, const void * p2)7 {8return (*( int *)p1 - *(int *) p2);9 }1011int main()12 {13int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };14 qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);15for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)16 {17 printf("%d ", arr[i]);18 }19 printf("\n");20return0;21 }2.对 char 类型的数组排序1//qosrt函数实现char型排序2 #include<stdio.h>3 #include<stdlib.h>4int char_cmp(const void* str1, const void* str2)5 {6return *(char*)str1 - *(char*)str2;7 }89int main()10 {11char str[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };12 qsort(str, sizeof(str) / sizeof(str[0]), sizeof(char), char_cmp);13for (int i = 0; i < sizeof(str) / sizeof(str[0]); ++i)14 {15 printf("%d ", str[i]);16 }1718return0;19 }3.对 double 类型数组排序(需要特别注意)1//qosrt函数实现double型排序2 #include<stdio.h>3 #include<stdlib.h>4int double_cmp(const void* arr1, const void* arr2)5 {6return *(double*)arr1 > *(double*)arr2 ? 1 : -1;7//注意这⾥是⽤⽐较⼤⼩的⽅法,来返回正负8 }910int main()11 {12double arr[] = { 1.4, 3.9, 5.4, 5.2, 9, 2, 4, 6, 8, 0 };13 qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(double), double_cmp); 14for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)15 {16 printf("%f ", arr[i]);17 }1819return0;20 }4.对结构体⼀级排序1 #include<stdio.h>2 #include<stdlib.h>34 typedef struct Student5 {6int x;7int y;8//按照x从⼩到⼤排序,当x相等时按照y从⼤到⼩排序9 }Student;1011 Student student[7];1213int cmp(const void *a, const void *b)14 {15 Student* pa1 = (Student*)a;16 Student* pa2 = (Student*)b;1718return (pa1->x) > (pa2->x) ? 1 : -1;19 }2021//展⽰⼀下对于结构体⾥赋值的后的结果22void Display()23 {24for (int i = 0; i < 7; ++i)25 {26 printf("%d\n",student[i].x);27 }28 }2930int main()31 {32int arr[7] = { 1,3,5,2,6,9,7 };33for (int i = 0; i < 7; ++i)34 {35//将数组arr中的元素赋值给结构体x中36 student[i].x = arr[i];37 }38 Display();39 qsort(student, 7, sizeof(Student), cmp);40for (int i = 0; i < 7; ++i)41 {42 printf("%d", student[i].x);43 }4445return0;46 }5.对机构体⼆级的排序就对于4中的结构体来说,如果给x赋值,则x中的值都为0,那么就需要来⽐较y中的数组。
c qsort函数用法 -回复
c qsort函数用法-回复Qsort函数是C语言中的一个标准库函数,用于对数组进行排序。
它的用法十分灵活,可以根据不同的情况和需求来自定义排序规则。
本文将一步一步回答有关qsort函数的用法以及如何自定义排序规则的问题。
一、什么是qsort函数?Qsort函数是C语言标准库中的一个排序函数,它可以对数组进行排序。
它的原型定义在头文件stdlib.h中,函数的完整声明如下:void qsort(void *base, size_t nmemb, size_t size,int(*compar)(const void *, const void *));二、参数解析1. base:需要排序的数组的首地址。
2. nmemb:数组中元素的个数。
3. size:每个元素的大小,单位为字节。
4. compar:比较函数的指针,用于定义排序的规则。
三、默认排序规则如果没有提供自定义的比较函数,qsort函数将按照默认的升序排序规则对数组进行排序。
默认的比较函数使用元素的大小来进行比较。
需要特别注意的是,数组中的元素必须具有可比较性,即元素类型必须支持'<'和'>'操作符。
四、自定义比较函数对于某些特殊情况下的排序需求,我们可能需要使用自定义的比较函数来定义排序规则。
比较函数的原型定义如下:int compar(const void *a, const void *b);比较函数必须返回一个整数值,用于指示a和b的大小关系。
返回值的语义如下:- 如果返回值小于0,则表示a小于b。
- 如果返回值等于0,则表示a等于b。
- 如果返回值大于0,则表示a大于b。
五、自定义排序规则的示例假设我们有一个存储了学生信息的结构体数组,每个学生信息包括姓名和年龄。
我们想要按照年龄从小到大的顺序对学生信息进行排序,可以使用qsort函数配合自定义的比较函数来实现。
首先,我们需要定义一个比较函数:int compare_age(const void *a, const void *b) {Student *student_a = (Student *)a;Student *student_b = (Student *)b;return student_a->age - student_b->age;接下来,我们可以调用qsort函数进行排序:qsort(students, num_students, sizeof(Student), compare_age);在上面的代码中,students是存储学生信息的结构体数组的首地址,num_students是数组中学生信息的个数,sizeof(Student)是每个学生信息的大小。
qsort函数用法
举个简单点的例子来说:
inta=10;
int&b=a;
这样b就和a完全一样啦
这个东东是相当好用的,比如我们想调用f(a,b,c)函数,并且希望对abc的值进行改变的话
。在c里面ms只可以用指针来实现。
但是用指针比较麻烦
有&这个符号就好用啦。
深入分析qsort库函数收藏
正如大家所知道的,快速排序算法是现在作为数据排序中很常用的算法,它集成在ANSI C的函数库中。我们经常使用快速排序,就是调用qsort函数,那么qsort函数里面到底是怎么实现的呢?我们现在就来看一看。
{
intn,m,i,j;
while(1)
{
scanf("%d%d",&n,&m);
if(n==0&&m==0) break;
for(i=0;i<n;i++)
{
scanf("%s",a[i]);
}
qsort((void*)a,n,sizeof(a[0]),cmp);
for(i=0;i<n;i++)
printf("%s\n",a[i]);
#include <stdlib.h>
#include <search.h>
#include <internal.h>
/*加快运行速度的优化选项*/
#pragmaoptimize("t", on)
/*函数原型*/
staticvoid __cdeclshortsort(char *lo, char *hi,size_twidth,
qsort及其用法
qsort及其用法一、函数原型void qsort(void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );大概的意思是,第一个参数指明了要排序的数组(比如:程序中的num),第二个参数给出了数组的大小(qsort没有足够的智力预知你传给它的数组的实际大小),第三个参数给出了数组中每个元素以字节为单位的大小。
最后那个长长的家伙,给出了排序时比较元素的方式..再给一个例子:int a[n];qsort(a,n,sizeof(int),comp); //从小到大排序int comp(const void* a,const void *b){int *x=(int*)a;int *y=(int*)b;return *x-*y; //如果a>b返回正数,如果a<b,返回负数,相等返回0;}二、qsort用法1、对int类型数组排序int num[100];Sample:int cmp ( const void *a , const void *b ){return *(int *)a - *(int *)b;}qsort(num,100,sizeof(num[0]),cmp);2、对char类型数组排序(同int类型)char word[100];Sample:int cmp( const void *a , const void *b ){return *(char *)a - *(int *)b;}qsort(word,100,sizeof(word[0]),cmp);3、对double类型数组排序(特别要注意)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);4、对结构体一级排序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 ? 1 : -1;}qsort(s,100,sizeof(s[0]),cmp);5、对结构体二级排序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);6、对字符串进行排序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);自己写一个纯字符串的:(temp是二维的字符串数组,j是一共需排序的字符串个数)int cmpstr(const void *a,const void *b){return strcmp((char*)a,(char*)b);}qsort(temp, j,sizeof(temp[0]),cmpstr);7、计算几何中求凸包的cmpint 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;}qsort()是c程序库stdlib.h中的一个函数,需要比较函数完成排序;sort()是STL中的标准算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
发信人: snoopy (阿排/好好玩ICPC~), 信区: ACM_ICPC标题: 快排qsort的用法详解发信站: 珞珈山水BBS站(Sat Apr 29 21:02:35 2006), 转信很多人问这个东西.我以前也看了好久,今天翻到以前学快排的时候写的练习code,基本上能覆盖绝大部分用法了.里面有很多地方没判断相等的情况,按道理来说相等情况下应该返回0的,这个请看代码的时候注意.我尽量保证代码不出错了.下面的这些说明和问题都是个人原创,没查什么资料,所以不保证其完全正确性,在此表示个人不对出现的问题负任何责任,大家WA了或者干吗的不要怪我,不过至少目前来说我用起来是没问题的:)/*----------------------------------------------------------------------------*/ ** 关于快排函数的一些说明**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]);}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]);}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);}void main(){scanf("%s",s);n=strlen(s);qsort(s,n,sizeof(s[0]),cmp);printf("%s\n",s);}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);}。