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;
}
}