在介绍qsort排序之前,先来回顾我之前学过的冒泡(也是笔记)
//实现冒泡排序
#include<stdio.h>
//输出函数
int print(int arr[],int sz)
{
for(int i =0;i<sz;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
//冒泡排序函数
bubble_sort(int arr[],int sz)
{
int i,j,temp;
for(i=0;i<sz-1;i++)
{
for(j=0;j<sz-1-i;j++)
if(arr[j]>arr[j+1])
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
int main()
{
int arr[10]={9,8,7,6,5,4,3,2,1,0};
int sz=sizeof(arr)/sizeof (arr[0]) ;
print(arr,sz);
bubble_sort(arr,sz);
print(arr,sz);
}
可见,冒泡排序是通过双层嵌套循环来进行的比大小(大的往后边走,小的往前面来)【升序排列】
接着,我们就通过qsort把冒泡排序稍加改一下,看看会有什么变化(同样是对整型数据元素进行排列):
qsort实现整形数据快速排序!!!!!
qsort实现整形数据快速排序!!!!!
qsort实现整形数据快速排序!!!!!
#include<stdio.h>
#include<stdlib.h>
int print(int arr[],int sz) //输出函数
{
for(int i =0;i<sz;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int cmp_int(const void*e1,const void*e2) //qsort函数
{
return *(int*)e1 - *(int*)e2 ;//通过两个参数的比较大小进行排序
}
int main()
{
int arr[10]={9,8,7,6,5,4,3,2,1,0};
int sz=sizeof(arr)/sizeof (arr[0]) ;
print(arr,sz);
qsort(arr,sz,sizeof(arr[0]),cmp_int);
print(arr,sz);
return 0;
}
结果都一样,而且对于整型元素来说都是,不管是从逻辑上,还是结果上,也都基本相似
(介绍阶段):这段代码中实现排序的函数是int cmp_int(const void*e1,const void*e2) //qsort函数 这段函数,这段函数是通过将e1,e2元素强制转化成int类型指针(因为是void类型,不能比较,所以得强制转换一下)并解引用的值相减得出结果判断谁大谁小得出。
//qsort实现结构题快速排序!!!!!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct student//首先进行结构体的定义
{
char name[20];
int age;
};
int age_sort(const void *e1,const void *e2)//年龄排序函数
{
return ((struct student*)e1)->age - ((struct student)*e2)->age ;
}
int name_sort(const void *e1,const void *e2)//姓名排序函数
{
return strcmp(((struct student *)e1)->name,((struct student *)e2)->name);
}
void test1()//定义结构体组
{
struct student s[3]={ {"Zhangsan",30},{"Lisi",34},{"Wangwu",20} };
int sz=sizeof(s)/sizeof(s[0]);
//按照年龄来排序
qsort(s,sz,sizeof(s[0]),age_sort);
//按照姓名来排序
qsort(s,sz,sizeof(s[0]),name_sort);
}
int main()
{
test1();
return 0;
}
分别用 :int age_sort(const void *e1,const void *e2)//年龄排序函数
int name_sort(const void *e1,const void *e2)//姓名排序函数
两个函数进行排序,需要有变化的是他们都是以指针指向的元素进行比较大小,尤其是进行姓名排序时候不用减法,直接采用字符特有的比较大小函数——strcmp函数
(本文章仅作笔记)