qsort排序板子

qsort.normal

普通的qsort

#include<stdio.h>//qsort,实现数组从小到大排列 
#include<stdlib.h>//qsort的库 
#define maxN 100000 //要改数组大小 
typedef long long ll;
int number[maxN+10];
int compare(const void * a,const void * b);//在这里只能是int  //a,b是选定了的两个数

int compare(const void * a,const void * b)
{
    if (*(int*)a <  *(int*)b ) return -1;
    if (*(int*)a == *(int*)b ) return 0; 
    if (*(int*)a >  *(int*)b ) return 1;
}

    qsort(number,n,sizeof(int),compare); 


/*关于qsort
qsort() 函数的声明: 
void *qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
参数: 
base -- 指向要排序的数组的第一个元素的指针。
nitems -- 由 base 指向的数组中元素的个数。
size -- 数组中每个元素的大小,以字节为单位。
compar -- 用来比较两个元素的函数。 
*/

qsort.2D array

用qsort实现二维数组排序,可以实现多关键字排序(但关键字数据类型需要相同)

//排序规则:按照每行第一个元素升序排序,第一个元素相同时按照第二个元素升序排序
int compare(const void *p, const void *q);
int compare(const void *p, const void *q) {
    int *a = (int *)p;
    int *b = (int *)q;
    if(a[0] > b[0]) return 1; //第一个元素a>b,返回1表示p指向的行应该在q指向的行的后面
    else if(a[0] < b[0]) return -1; //第一个元素a<b,返回-1表示p指向的行应该在q指向的行的前面
    else if(a[1] > b[1]) return 1; //此时一定第一个元素a=b,判断第二个元素
    else if(a[1] < b[1]) return -1;
    else return 0; //第一个,第二个元素均相等,返回0表示p指向的行和q指向的行无确定前后关系(按原数组中顺序排列)
}
//调用qsort函数对二维数组int data[1000][2]前n行根据规则进行排序:
qsort(data, n, sizeof(data[0]), compare);

qsort.struct

用qsort实现结构体排序,可以实现多关键字排序

typedef struct LLL{
    int name;
    int val;
}L;
L l[1010];
int compare(const void * a,const void * b){//从小到大排序
    L* pa=(L*)a;
    L* pb=(L*)b;
    if (pa->val < pb->val) return -1;//val的优先级在前
    else if (pa->val > pb->val) return 1;
    else if (pa->name < pb->name) return -1;
    else if (pa->name > pb->name) return 1;
    else return 0;
}
qsort(l,n,sizeof(L),compare);

一份代码

题意大概是实现OJ平台排名的功能,不定行输入,输入同学的学号(字符串),得分(浮点数),耗时(整数)
排序规则:得分越高排名越高前,得分相同时,耗时少的排名靠前
需要输出的是,按要求排序后的学号(宽度为10),得分(宽度为8,保留2位小数),耗时(宽度为10)

代码中一些变量的含义

学号(字符串):对应代码中的ch[20]
得分(浮点数):对应代码中的m
耗时(整数):对应代码中的a

我用/***注释***/这样的注释,展示了这个板子需要修改的部分

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
typedef struct L{
    char ch[20];/***如果要保留的信息不是char[]+double+int,就改这三行的内容***/
    int a;		/***如果要保留的信息不是char[]+double+int,就改这三行的内容***/
    double m;	/***如果要保留的信息不是char[]+double+int,就改这三行的内容***/
}L;
L l[101000];

int compare(const void * a,const void * b);
int compare(const void * a,const void * b){
    L* pa=(L*)a;
    L* pb=(L*)b;
	if (pa->m > pb->m) return -1;//m的优先级在前//大到小	/***在这四行,改排序方式(优先级+升序/降序),如果改升序/降序:只需要改>及<,如果改m和a的优先级,将前两行和后两行互换位置***/
	else if (pa->m < pb->m) return 1;					/***在这四行,改排序方式(优先级+升序/降序)***/
    else if (pa->a < pb->a) return -1;//小到大			/***在这四行,改排序方式(优先级+升序/降序)***/
	else if (pa->a > pb->a) return 1;					/***在这四行,改排序方式(优先级+升序/降序)***/
	else return 0;
}

int main()
{

    int i = 0;
    while (scanf("%s", l[i].ch) != EOF)			/***在这里更改读入形式,注意&符号的用法由.后的数据类型决定。***/
    {
        scanf(" %lf %d", &l[i].m, &l[i].a);		/***在这里更改读入形式***/
        i++;
    }

    qsort(l, i, sizeof(L), compare);			/***这里的i可能需要更改(如果题目不是不定行输入的话,可能会改成n)***/
    for (int j = 0; j < i; j++)
    { // 输出
        printf("%10s %8.2lf %10d\n", l[j].ch, l[j].m, l[j].a);	/***在这里更改输出形式,注意格式化输出的使用方式***/
    }
    return 0;
}

qsort.char

字典序排序

int compare(const void *p1, const void *p2);
int compare(const void *p1, const void *p2) {
    char *a = (char *)p1; //将p1强制转换为char*类型的指针
    char *b = (char *)p2; //将p2强制转换为char*类型的指针
    return strcmp(a, b); //返回两个字符串的字典序大小
    qsort(str,n,sizeof(str[0]),compare);
}

冒泡

// 优化的冒泡排序算法 
void bubblesort(int a[], int n);
void bubblesort(int a[], int n)//对a[]排序,从小到大,n是a[]中一共有n个数
{
    int i, j, hold, flag;
    for (i = 0; i < n-1; i++)
    {
        flag = 0;
        for (j = 0; j < n-1-i; j++)
        {
            if (a[j] > a[j + 1])//升序排列
            {
                hold = a[j];
                a[j] = a[j + 1]; 
                a[j + 1] = hold; 
                flag = 1;
            }
        }
        if (0 == flag)//如果已经是排好的顺序,就不再排了
            break;
    }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
qsort函数是C语言编译器函数库自带的排序函数,也被称为快速排序函数。它可以用来对各种类型的数据进行排序,包括浮点型数据。 在使用qsort函数对浮点型数据进行排序时,需要注意以下几点: 1. 首先,需要提供一个比较函数(comparison function),用于指定排序的规则。比较函数需要接受两个参数,这两个参数是待排序元素的指针。比较函数应该返回一个整数值,表示两个元素的大小关系。如果返回值小于0,则表示第一个元素小于第二个元素;如果返回值等于0,则表示两个元素相等;如果返回值大于0,则表示第一个元素大于第二个元素。 2. 其次,需要提供待排序数据的起始地址和元素的数量。 下面是一个示例的比较函数,用于对浮点型数据进行排序: ```c int compare(const void *a, const void *b) { float x = *(const float *)a; float y = *(const float *)b; if (x < y) { return -1; } else if (x > y) { return 1; } else { return 0; } } ``` 然后,我们可以使用qsort函数来对浮点型数组进行排序。假设我们有一个名为data的浮点型数组,数组元素的数量为num。 ```c qsort(data, num, sizeof(float), compare); ``` 这样,就可以使用qsort函数对浮点型数据进行排序了。 需要注意的是,由于qsort函数是一个不稳定的排序算法,如果两个元素的值相同,它们的前后顺序是不确定的。因此,在对浮点型数据进行排序时,需要注意可能会有相同值的元素的顺序会发生变化。 希望以上解答对您有帮助。如有任何疑问,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值