qsort函数是库函数中的一员,我们先来看看官方文档是怎么写的:

其中qsort的参数void* base是传入一个数组,size_t num 为数组整体大小,size_t size 为单个元素的大小,int (*compar)(const void*,const void*)是需要使用者去完成的一个比较函数

针对这个函数,在不同类型的数组中需要用不同的处理方式,来保证数组中的元素大小不会失真(例如在处理double型的数组时就需要用不同的方式来进行)

比较函数的返回值是;

return value meaning
<0 The element pointed to by p1 goes before the element pointed to by p2
0 The element pointed to by p1 is equivalent to the element pointed to by p2
>0 The element pointed to by p1 goes after the element pointed to by p2

我们来看一个例子:这是官方文档为我们提供的一个例子:关于对 qsort 的使用

 /* qsort example */
#include <stdio.h> /* printf */
#include <stdlib.h> /* qsort */ int values[] = { , , , , , }; int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
} int main ()
{
int n;
qsort (values, , sizeof(int), compare);
for (n=; n<; n++)
printf ("%d ",values[n]);
return ;
}

1.对 int 类型的数组排序

 //qsort函数
#include <stdio.h>
#include<stdlib.h>
//qsort函数实现int型排序
//qosrt函数的使用者得实现一个比较函数
int int_cmp(const void * p1, const void * p2)
{
return (*( int *)p1 - *(int *) p2);
} int main()
{
int arr[] = { , , , , , , , , , };
qsort(arr, sizeof(arr) / sizeof(arr[]), sizeof(int), int_cmp);
for (int i = ; i < sizeof(arr) / sizeof(arr[]); i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return ;
}

2.对 char 类型的数组排序

 //qosrt函数实现char型排序
#include<stdio.h>
#include<stdlib.h>
int char_cmp(const void* str1, const void* str2)
{
return *(char*)str1 - *(char*)str2;
} int main()
{
char str[] = { , , , , , , , , , };
qsort(str, sizeof(str) / sizeof(str[]), sizeof(char), char_cmp);
for (int i = ; i < sizeof(str) / sizeof(str[]); ++i)
{
printf("%d ", str[i]);
} return ;
}

3.对 double 类型数组排序(需要特别注意)

 //qosrt函数实现double型排序
#include<stdio.h>
#include<stdlib.h>
int double_cmp(const void* arr1, const void* arr2)
{
return *(double*)arr1 > *(double*)arr2 ? : -;
//注意这里是用比较大小的方法,来返回正负
} int main()
{
double arr[] = { 1.4, 3.9, 5.4, 5.2, , , , , , };
qsort(arr, sizeof(arr) / sizeof(arr[]), sizeof(double), double_cmp);
for (int i = ; i < sizeof(arr) / sizeof(arr[]); ++i)
{
printf("%f ", arr[i]);
} return ;
}

4.对结构体一级排序

 #include<stdio.h>
#include<stdlib.h> typedef struct Student
{
int x;
int y;
//按照x从小到大排序,当x相等时按照y从大到小排序
}Student; Student student[]; int cmp(const void *a, const void *b)
{
Student* pa1 = (Student*)a;
Student* pa2 = (Student*)b; return (pa1->x) > (pa2->x) ? : -;
} //展示一下对于结构体里赋值的后的结果
void Display()
{
for (int i = ; i < ; ++i)
{
printf("%d\n",student[i].x);
}
} int main()
{
int arr[] = { ,,,,,, };
for (int i = ; i < ; ++i)
{
//将数组arr中的元素赋值给结构体x中
student[i].x = arr[i];
}
Display();
qsort(student, , sizeof(Student), cmp);
for (int i = ; i < ; ++i)
{
printf("%d", student[i].x);
} return ;
}

5.对机构体二级的排序

就对于4中的结构体来说,如果给x赋值,则x中的值都为0,那么就需要来比较y中的数组。

则可以将代码改为下面这样:

 #include<stdio.h>
#include<stdlib.h> typedef struct Student
{
int x;
int y;
//按照x从小到大排序,当x相等时按照y从大到小排序
}Student; Student student[]; int cmp(const void *a, const void *b)
{
Student* pa1 = (Student*)a;
Student* pa2 = (Student*)b; if (pa1->x != pa2->x)
{
return (pa1->x) > (pa2->x) ? : -;
}
else
{
return (pa1->y) > (pa2->y) ? : -;
}
} //展示一下对于结构体里赋值的后的结果
void Display()
{
printf("x=");
for (int i = ; i < ; ++i)
{
printf("%d", student[i].x);
}
printf("\n");
printf("y=");
for (int i = ; i < ; ++i)
{
printf("%d", student[i].y);
}
printf("\n");
} int main()
{
int arr[] = { ,,,,,, };
for (int i = ; i < ; ++i)
{
//将数组arr中的元素赋值给结构体x中
student[i].y = arr[i];
}
Display();
printf("排序结构体中的y:\n");
qsort(student, , sizeof(Student), cmp);
for (int i = ; i < ; ++i)
{
printf("%d", student[i].y);
} return ;
}

6.模仿qsort的功能实现一个通用的冒泡排序

 //用回调函数模拟实现qsort(冒泡排序的方式)

 #include <stdio.h>

 int int_cmp(const void * p1, const void * p2)
{
return (*(int *)p1 > *(int *)p2);
} void _swap(void *p1, void * p2, int size)
{
int i = ;
for (i = ; i < size; i++)
{
char tmp = *((char *)p1 + i);
*((char *)p1 + i) = *((char *)p2 + i);
*((char *)p2 + i) = tmp;
}
} void bubble(void *base, int count, int size, int(*cmp)(void *, void *))
{
int i = ;
int j = ;
for (i = ; i < count - ; i++)
{
for (j = ; j < count - i - ; j++)
{
if (cmp((char *)base + j * size, (char *)base + (j + )*size) > )
{
_swap((char *)base + j * size, (char *)base + (j + )*size, size);
}
}
}
}
int main() {
int arr[] = { , , , , , , , , , };
//char *arr[] = {"aaaa","dddd","cccc","bbbb"};    
int i = ;
bubble(arr, sizeof(arr) / sizeof(arr[]), sizeof (int), int_cmp);
for (i = ; i< sizeof(arr) / sizeof(arr[]); i++)
{
printf( "%d ", arr[i]);
}
printf("\n");
return ;
}

qsort函数排序各种类型的数据。的更多相关文章

  1. QSort函数对不同类型数据快速排序浅谈

    一.对int类型数组排序 int num[100]; int cmp ( const void *a , const void *b ){return *(int *)a - *(int *)b;} ...

  2. 【C/C++】qsort函数的使用方法和细节

    函数概述 qsort 为quick_sort的简写,意为快速排序,主要用于对各种数组的排序. 因为数组的元素可能是任何类型的,甚至是结构或者联合,所以必须高数函数qsort如何确定两个数组元素哪一个& ...

  3. C语言中qsort函数用法

    C语言中qsort函数用法-示例分析    本文实例汇总介绍了C语言中qsort函数用法,包括针对各种数据类型参数的排序,非常具有实用价值非常具有实用价值. 分享给大家供大家参考.C语言中的qsort ...

  4. 使用C语言中qsort()函数对浮点型数组无法成功排序的问题

    一 写在开头 1.1 本节内容 本节主要内容是有关C语言中qsort()函数的探讨. 二 问题和相应解决方法 qsort()是C标准库中的一个通用的排序函数.它既能对整型数据进行排序也能对浮点型数据进 ...

  5. Mysql order by 排序 varchar 类型数据

    Mysql order by 排序 varchar 类型数据 varchar 类型字段排序,  会將数字当成字符串来处理.  排序规则一般是从左到右一位位来比较. +0之后 就转化成INT 类型排序 ...

  6. qsort函数、sort函数【转】

    http://blog.163.com/yuhua_kui/blog/static/9679964420142195442766/ 先说明一下:qsort和sort,只能对连续内存的数据进行排序,像链 ...

  7. C中的qsort函数和C++中的sort函数的理解与使用

    一.qsort()函数 原型:_CRTIMP void __cdecl qsort (void*, size_t, size_t,int (*)(const void*, const void*)); ...

  8. qsort函数用法【转】

    qsort函数用法 qsort 功 能: 使用快速排序例程进行排序  用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(con ...

  9. qsort函数用法

    qsort函数用法   qsort 功 能: 使用快速排序例程进行排序 用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(co ...

随机推荐

  1. shiro框架

    Shiro Shiro简介 SpringMVC整合Shiro,Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能. Authentication:身份认证/登录,验证用 ...

  2. js数组和数组去重的几种简单的方法

    http://blog.csdn.net/liangklfang/article/details/49300417 1.证明一个对象是数组的方法. 方法(1) [].constructor === A ...

  3. RabbitMq(6) 如何保证消息不丢包

    RabbitMQ一般情况很少丢失,但是不能排除意外,为了保证我们自己系统高可用,我们必须作出更好完善措施,保证系统的稳定性. 下面来介绍下,如何保证消息的绝对不丢失的问题,下面分享的绝对干货,都是在知 ...

  4. 机器学习 之XGBoost算法

    目录 1.基本知识点简介 2.XGBoost提升树算法 2.1 XGBoost原理 2.2 XGBoost中损失函数的泰勒展开 2.3 XGBoost中正则化项的选定 2.4 最终的目标损失函数及其最 ...

  5. Codeforces Round #349 (Div. 1)E. Forensic Examination

    题意:给一个初始串s,和m个模式串,q次查询每次问你第l到第r个模式串中包含\(s_l-s_r\)子串的最大数量是多少 题解:把初始串和模式串用分隔符间隔然后建sam,我们需要找到在sam中表示\(s ...

  6. webForm TO MVC

     

  7. javascript高级程序设计第3版——第一章概括

    最近发现Xmind思维导图是个好东西,刚好开始看书,被用来归纳最好不过了

  8. NOIp 2018 D2T1 旅行//未完成

    这个题没有认真读的话就会写下以下的DD代码 #include<bits/stdc++.h> #define N 5010 using namespace std; int n,m; int ...

  9. 一天一点Zynq(1)xilinx-arm-linux交叉编译链 安装总结以及资源更新

    结束了对xilinx-arm-linux交叉编译链安装后,总结一下整个过程,方便后来的研究者们,少走点弯路. 关于xilinx-arm-linux交叉编译链的安装,网上一搜一大把,可是有的资料中的资源 ...

  10. python实现算术表达式的词法语法语义分析(编译原理应用)

    本学期编译原理的一个大作业,我的选题是算术表达式的词法语法语义分析,当时由于学得比较渣,只用了递归下降的方法进行了分析. 首先,用户输入算术表达式,其中算术表达式可以包含基本运算符,括号,数字,以及用 ...