精华内容
下载资源
问答
  • 前言各种排序方法中,例如冒泡、插入,快排等我最喜欢用快速排序,特别欣赏快排的分治思想,调用系统的qsort函数前希望大家也能了解一下快速排序的原理,参考链接见:... size_t nmemb, size_t size, int(*c...

    前言

    各种排序方法中,例如冒泡、插入,快排等我最喜欢用快速排序,特别欣赏快排的分治思想,调用系统的qsort函数前希望大家也能了解一下快速排序的原理,参考链接见:

    http://blog.csdn.net/zinss26914/article/details/8043168

    qsort函数原型

    void qsort(void *base, size_t nmemb, size_t size, int(*compare) (const void *, const void *));

    函数原型在中找到

    参数详解

    base : 指向数组中第一个元素(如果只是对数组的一段区域进行排序,那么要使base指向这段区域的第一个元素)

    nmemb: 要排序元素的数量

    size : 每个数组元素的大小,用字节来衡量

    compare : 指向比较函数的指针

    重点

    数组的元素可能是任何类型的,甚至可能是结构体或联合,所以必须告诉函数qsort如何确定两个数组元素哪一个“更小”。通过编写

    比较函数可以为qsort提供这些信息。当给定两个指向数组元素的指针p和q时,比较函数必须返回一个整数,如果*p小于*q,那么返回的数为负数;如果*p等于*q,那么返回0.如果*p大于*q,返回正数.按照这种结果返回,qsort对数组默认是升序排序.如果想降序,只需要将上述结果返回值*-1即可

    测试用例

    int&&char数组排序(c代码)

    以int数组为测试例子,进行排序

    #include

    #include

    int compi(const void *a, const void *b)

    {

    const int *p = a;

    const int *q = b;

    return *p - *q;

    }

    int compd(const void *a, const void *b)

    {

    const int *p = a;

    const int *q = b;

    return (*p - *q) * (-1);

    }

    int main()

    {

    int a[1000];

    int i, len, type;

    while(scanf("%d %d", &len, &type) != EOF)

    {

    for(i = 0; i < len; i ++)

    {

    scanf("%d", &a[i]);

    }

    switch(type)

    {

    case 1 :

    //递增排序

    qsort(a, len, sizeof(a[0]), compi);

    break;

    case 2 :

    //递减排序

    qsort(a, len, sizeof(a[0]), compd);

    break;

    }

    if(type == 1)

    {

    printf("递增排序结果:\n");

    }else

    {

    printf("递减排序结果:\n");

    }

    for(i = 0; i < len; i ++)

    {

    printf("%d ", a[i]);

    }

    printf("\n");

    }

    return 0;

    }

    测试结果:

    0095c5dbce083a97aa8aefac2091e873.png

    结构体数组排序

    大同小异,简单的贴一道acm题,来说明结构体数组排序的方法吧

    excel排序

    题目描述:

    Excel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。

    对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3

    时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。

    输入:

    测试输入包含若干测试用例。每个测试用例的第1行包含两个整数 N (N<=100000) 和 C,其中 N 是纪录的条数,C 是指定排序的列号。以下有N行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,同组测试中没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩(闭区间[0, 100]内的整数)组成,每个项目间用1个空格隔开。当读到 N=0 时,全部输入结束,相应的结果不要输出。

    输出:

    对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3

    时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。

    样例输入:

    3 1

    000007 James 85

    000010 Amy 90

    000001 Zoe 60

    4 2

    000007 James 85

    000010 Amy 90

    000001 Zoe 60

    000002 James 98

    4 3

    000007 James 85

    000010 Amy 90

    000001 Zoe 60

    000002 James 90

    0 0

    样例输出:

    Case 1:

    000001 Zoe 60

    000007 James 85

    000010 Amy 90

    Case 2:

    000010 Amy 90

    000002 James 98

    000007 James 85

    000001 Zoe 60

    Case 3:

    000001 Zoe 60

    000007 James 85

    000002 James 90

    000010 Amy 90

    ac代码

    #include

    #include

    #include

    struct student

    {

    char num[7];

    char name[9];

    int grade;

    };

    int compareByNum(const void *a, const void *b);

    int compareByName(const void *a, const void *b);

    int compareByGrade(const void *a, const void *b);

    int main()

    {

    int i, n, k;

    struct student people[100001];

    static int size = 1;

    while(scanf("%d %d", &n, &k) != EOF)

    {

    if(n == 0)

    break;

    //接收客户端数据

    for(i = 0; i < n; i ++)

    {

    scanf("%s %s %d", people[i].num, people[i].name, &people[i].grade);

    }

    //快速排序

    switch(k)

    {

    case 1 :

    //按学号排序

    qsort(people, n, sizeof(people[0]), compareByNum);

    break;

    case 2 :

    //按姓名排序

    qsort(people, n, sizeof(people[0]), compareByName);

    break;

    case 3 :

    //按成绩排序

    qsort(people, n, sizeof(people[0]), compareByGrade);

    break;

    }

    //打印输出

    printf("Case %d:\n", size ++);

    for(i = 0; i < n; i ++)

    {

    printf("%s %s %d\n", people[i].num, people[i].name, people[i].grade);

    }

    }

    return 0;

    }

    int compareByNum(const void *a, const void *b)

    {

    const struct student *p = a;

    const struct student *q = b;

    return strcmp(p->num, q->num);

    }

    int compareByName(const void *a, const void *b)

    {

    const struct student *p = a;

    const struct student *q = b;

    if(strcmp(p->name, q->name) > 0)

    {

    return 1;

    }else if(strcmp(p->name, q->name) == 0 && strcmp(p->num, q->num) > 0)

    {

    return 1;

    }else

    {

    return -1;

    }

    }

    int compareByGrade(const void *a, const void *b)

    {

    const struct student *p = a;

    const struct student *q = b;

    if(p->grade > q->grade)

    {

    return 1;

    }else if(p->grade == q->grade && strcmp(p->num, q->num) > 0)

    {

    return 1;

    }else

    {

    return -1;

    }

    }

    展开全文
  • 前言各种排序方法中,例如冒泡、插入,快排等我最喜欢用快速排序,特别欣赏快排的分治思想,调用系统的qsort函数前希望大家也能了解一下快速排序的原理,参考链接见:... size_t nmemb, size_t size, int(*compare) ...

    前言

    各种排序方法中,例如冒泡、插入,快排等我最喜欢用快速排序,特别欣赏快排的分治思想,调用系统的qsort函数前希望大家也能了解一下快速排序的原理,参考链接见:http://www.linuxidc.com/Linux/2013-01/78683.htm

    qsort函数原型

    void qsort(void *base, size_t nmemb, size_t size, int(*compare) (const void *, const void *));

    函数原型在中找到

    参数详解

    base  : 指向数组中第一个元素(如果只是对数组的一段区域进行排序,那么要使base指向这段区域的第一个元素)

    nmemb : 要排序元素的数量

    size    : 每个数组元素的大小,用字节来衡量

    compare : 指向比较函数的指针

    重点

    数组的元素可能是任何类型的,甚至可能是结构体或联合,所以必须告诉函数qsort如何确定两个数组元素哪一个“更小”。通过编写比较函数可以为qsort提供这些信息。当给定两个指向数组元素的指针p和q时,比较函数必须返回一个整数,如果*p小于*q,那么返回的数为负数;如果*p等于*q,那么返回0.如果*p大于*q,返回正数.按照这种结果返回,qsort对数组默认是升序排序.如果想降序,只需要将上述结果返回值*-1即可

    测试用例

    int&&char数组排序(c代码)

    以int数组为测试例子,进行排序

    #include

    #include

    int compi(const void *a, const void *b)

    {

    const int *p = a;

    const int *q = b;

    return *p - *q;

    }

    int compd(const void *a, const void *b)

    {

    const int *p = a;

    const int *q = b;

    return (*p - *q) * (-1);

    }

    int main()

    {

    int a[1000];

    int i, len, type;

    while(scanf("%d %d", &len, &type) != EOF)

    {

    for(i = 0; i < len; i ++)

    {

    scanf("%d", &a[i]);

    }

    switch(type)

    {

    case 1 :

    //递增排序

    qsort(a, len, sizeof(a[0]), compi);

    break;

    case 2 :

    //递减排序

    qsort(a, len, sizeof(a[0]), compd);

    break;

    }

    if(type == 1)

    {

    printf("递增排序结果:\n");

    }else

    {

    printf("递减排序结果:\n");

    }

    for(i = 0; i < len; i ++)

    {

    printf("%d ", a[i]);

    }

    printf("\n");

    }

    return 0;

    }

    测试结果:

    451377134d364f169bece52ed4f6d98d.png0b1331709591d260c1c78e86d0c51c18.png

    展开全文
  • c语言调用库函数qsort()进行快速排序

    万次阅读 2013-01-26 18:20:42
    前言 各种排序方法中,例如冒泡、插入,快排等我最喜欢用快速排序,特别欣赏快排的分治思想,调用系统的qsort函数前希望大家也能了解一下快速排序的原理,参考链接见:... qsort函数原型 void qsort(void *base, ...

    前言

    各种排序方法中,例如冒泡、插入,快排等我最喜欢用快速排序,特别欣赏快排的分治思想,调用系统的qsort函数前希望大家也能了解一下快速排序的原理,参考链接见:http://blog.csdn.net/zinss26914/article/details/8043168

    qsort函数原型

    void qsort(void *base, size_t nmemb, size_t size, int(*compare) (const void *, const void *));
    函数原型在<stdlib.h>中找到

    参数详解

    base 	: 指向数组中第一个元素(如果只是对数组的一段区域进行排序,那么要使base指向这段区域的第一个元素)
    nmemb	: 要排序元素的数量
    size    : 每个数组元素的大小,用字节来衡量
    compare : 指向比较函数的指针
    

    重点

    数组的元素可能是任何类型的,甚至可能是结构体或联合,所以必须告诉函数qsort如何确定两个数组元素哪一个“更小”。通过编写比较函数可以为qsort提供这些信息。当给定两个指向数组元素的指针p和q时,比较函数必须返回一个整数,如果*p小于*q,那么返回的数为负数;如果*p等于*q,那么返回0.如果*p大于*q,返回正数.按照这种结果返回,qsort对数组默认是升序排序.如果想降序,只需要将上述结果返回值*-1即可

    测试用例

    int&&char数组排序(c代码)

    以int数组为测试例子,进行排序

    #include <stdio.h>
    #include <stdlib.h>
    
    int compi(const void *a, const void *b)
    {
    	const int *p = a;
    	const int *q = b;
    
    	return *p - *q;
    }
    
    int compd(const void *a, const void *b)
    {
    	const int *p = a;
    	const int *q = b;
    
    	return (*p - *q) * (-1);
    }
    
    
    int main()
    {
    	int a[1000];
    	int i, len, type;
    
    	while(scanf("%d %d", &len, &type) != EOF)
    	{
    		for(i = 0; i < len; i ++)
    		{
    			scanf("%d", &a[i]);
    		}
    
    		switch(type)
    		{
    			case 1 :
    				//递增排序
    				qsort(a, len, sizeof(a[0]), compi);
    				break;
    			case 2 :
    				//递减排序
    				qsort(a, len, sizeof(a[0]), compd);
    				break;
    		}
    
    		if(type == 1)
    		{
    			printf("递增排序结果:\n");
    		}else
    		{
    			printf("递减排序结果:\n");
    		}
    		for(i = 0; i < len; i ++)
    		{
    
    			printf("%d ", a[i]);
    		}
    		printf("\n");
    	}
    	return 0;
    } 
    

    测试结果:




    结构体数组排序

    大同小异,简单的贴一道acm题,来说明结构体数组排序的方法吧

    excel排序

    题目描述:
        Excel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。
        对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3 
    时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
    输入:
        测试输入包含若干测试用例。每个测试用例的第1行包含两个整数 N (N<=100000) 和 C,其中 N 是纪录的条数,C 是指定排序的列号。以下有N行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,同组测试中没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩(闭区间[0, 100]内的整数)组成,每个项目间用1个空格隔开。当读到 N=0 时,全部输入结束,相应的结果不要输出。
    输出:
        对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3 
    时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
    样例输入:
    3 1
    000007 James 85
    000010 Amy 90
    000001 Zoe 60
    4 2
    000007 James 85
    000010 Amy 90
    000001 Zoe 60
    000002 James 98
    4 3
    000007 James 85
    000010 Amy 90
    000001 Zoe 60
    000002 James 90
    0 0
    样例输出:
    Case 1:
    000001 Zoe 60
    000007 James 85
    000010 Amy 90
    Case 2:
    000010 Amy 90
    000002 James 98
    000007 James 85
    000001 Zoe 60
    Case 3:
    000001 Zoe 60
    000007 James 85
    000002 James 90
    000010 Amy 90

    ac代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct student
    {
    	char num[7];
    	char name[9];
    	int grade;
    };
    
    int compareByNum(const void *a, const void *b);
    int compareByName(const void *a, const void *b);
    int compareByGrade(const void *a, const void *b);
    
    int main()
    {
    	int i, n, k;
    	struct student people[100001];
    	static int size = 1;
    
    	while(scanf("%d %d", &n, &k) != EOF)
    	{
    		if(n == 0)
    			break;
    		//接收客户端数据
    		for(i = 0; i < n; i ++)
    		{
    			scanf("%s %s %d", people[i].num, people[i].name, &people[i].grade);
    		}
    
    		//快速排序
    		switch(k)
    		{
    			case 1 :
    				//按学号排序
    				qsort(people, n, sizeof(people[0]), compareByNum);
    				break;
    			case 2 :
    				//按姓名排序
    				qsort(people, n, sizeof(people[0]), compareByName);
    				break;
    			case 3 :
    				//按成绩排序
    				qsort(people, n, sizeof(people[0]), compareByGrade);
    				break;
    		}
    
    		//打印输出
    		printf("Case %d:\n", size ++);
    		for(i = 0; i < n; i ++)
    		{
    			printf("%s %s %d\n", people[i].num, people[i].name, people[i].grade);
    		}
    	}
    
    	return 0;
    }
    
    int compareByNum(const void *a, const void *b)
    {
    	const struct student *p = a;
    	const struct student *q = b;
    
    	return strcmp(p->num, q->num);	
    }
    
    int compareByName(const void *a, const void *b)
    {
    	const struct student *p = a;
    	const struct student *q = b;
    
    	if(strcmp(p->name, q->name) > 0)
    	{
    		return 1;
    	}else if(strcmp(p->name, q->name) == 0 && strcmp(p->num, q->num) > 0)
    	{
    		return 1;
    	}else
    	{
    		return -1;
    	}
    }
    
    int compareByGrade(const void *a, const void *b)
    {
    	const struct student *p = a;
    	const struct student *q = b;
    
    	if(p->grade > q->grade)
    	{
    		return 1;
    	}else if(p->grade == q->grade && strcmp(p->num, q->num) > 0)
    	{
    		return 1;
    	}else
    	{
    		return -1;
    	}
    }
    



    展开全文
  • c语言库函数有些是利用系统调用实现的,有些不是.我就想问下不是利用系统调用的那部分,在执行时硬件是怎么知道的呢?最后语言代码被编译成二进制,执行时仍然是由寄存器硬件什么执行的吧,既然没利用系统调用,...
  • c语言==系统调用库函数的区别(28)

    千次阅读 2016-12-26 22:05:42
    (2)库函数在用户地址空间执行,系统调用是在内核地址空间执行,库函数运行时间属于用户时间,系统调用属于系统时间,库函数开销较小,系统调用开销较大 (3)库函数是有缓冲的,系统调用是无缓冲的 系统调用依赖于...

    系统调用与库函数的区别?
    (1)库函数是语言或应用程序的一部分,而系统调用是内核提供给应用程序的接口,属于系统的一部分
    (2)库函数在用户地址空间执行,系统调用是在内核地址空间执行,库函数运行时间属于用户时间,系统调用属于系统时间,库函数开销较小,系统调用开销较大
    (3)库函数是有缓冲的,系统调用是无缓冲的
    系统调用依赖于平台,库函数并不依赖

    展开全文
  • "C语言的标准库函数,基本都是通过系统API调用实现的,比如,我们常用的printf scanf函数就是通过API调用实现的“-------------请问对吗?????
  • 通过调用C语言库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制 前言说明 本篇为网易云课堂Linux内核分析课程的第四周作业,我将通过调用C语言库函数与在C代码中使用内联...
  • 使用系统调用的read write 和库函数中的fread fwrite来读取一本文本,比较两者的效率。
  • C语言 系统函数和库函数的区别

    千次阅读 2018-05-14 13:59:16
    调用:是操作系统为用户态运行的进程和硬件设备(如CPU、磁盘、打印机等)进行交互提供的一组接口,即就是设置在应用程序和硬件设备之间的一个接口层。可以说是操作系统留给用户程序的一个接口。再来说一下,linux...
  • C系统调用库函数的区别?  (1)库函数是语言或应用程序的一部分,而系统调用是内核提供给应用程序的接口,属于系统的一部分  (2)库函数在用户地址空间执行,系统调用是在内核地址空间执行,库函数运行时间属于...
  • 系统调用库函数

    2019-04-15 17:08:54
    系统调用库函数系统调用:unix操作系统所提供的良好定义、数量有限、之间进入内核的入口点 ...C语言库函数实际上都是通过系统调用来实现的 区别: 库函数是可以灵活地被替换的,但是系统调用不是 ...
  • C语言库函数---unix常用系统调用---使用说明
  • C语言库函数---unix常用系统调用........
  • 前者依赖于Linux系统调用,后者实际上与操作系统是独立的,因为在任何操作系统下,使用C语言I/O库函数操作文件的方法都是相同的。 Introduction 一.通过系统调用访问文件  即通过Linux文件API访问文件,Linux的...
  • 系统调用库函数

    2015-11-10 01:29:53
    今天就简单记个关于系统调用库函数的笔记。 定义:系统调用,顾名思义就是系统要调用的函数,算是比较底层的函数调用了。此类函数主要面向硬件。库函数就是标准c语言库提供的供用户调用的面向应用程序开发的接口。...
  • 1、open是Unix系统调用函数(包括Linux),返回的是文件描述符(File Descriptor),它是文件在文件描述符表里的索引 fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核API,返回的是一个指向文件...
  • C语言】【unix c】库函数系统调用的关系
  • 我们都知道,C语言在UNIX/Linux系统下有一套系统调用(系统函数),比如文件操作open()、close()、write()、read()等,而标准C语言库函数中也有一套对文件的操作函数fopen()、fclose()、fwrite()、fread()等....
  • C库函数系统调用的区别

    千次阅读 2021-05-23 10:26:00
    1.系统调用库函数本身没有什么关系,也不能说哪一个更底层,因为C语言库函数不一定调用系统调用系统调用也不一定调用C语言库函数 2.下面这张图给出的是用户自定义的函数和系统调用的关系,以及用户自定义的函数...
  • C语言——系统函数和库函数的区别

    千次阅读 2016-12-10 20:41:06
    系统调用:是操作系统为用户态运行的进程和硬件设备(如CPU、磁盘、打印机等)进行交互提供的一组接口,即就是设置在应用程序和硬件设备之间的一个接口层。可以说是操作系统留给用户程序的一个接口。再来说一下,linux...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 795
精华内容 318
关键字:

c语言系统调用库函数

c语言 订阅