#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Stu{
int no;
char name[40];
int score[3];
}Stu;
/*
函数功能:排序(万能排序)
形参列表:
void *base:数据起始位置
size_t nmemb:数据的个数
size_t size:每个元素的字节大小
int (*compare)(const void *,const void *):排序规则
*/
void sort(void *base,size_t nmemb,size_t size,int (*compare)(const void *,const void *)){
int i,j;
char *pbase = base;
void *pkey = malloc(size);//申请一片动态内存
for(i=1;i<nmemb;i++){
//pbase+i*size 要插入的数据元素的地址
memcpy(pkey,pbase+i*size,size);//提前保存该元素
for(j=i-1;j>=0&&compare(pbase+j*size,pkey)>0;--j){
memcpy(pbase+(j+1)*size,pbase+j*size,size);
}
memcpy(pbase+(j+1)*size,pkey,size);
}
free(pkey);
}
// 升序函数
int compare(const void *p1,const void *p2){
const int *pn1 = p1;
const int *pn2 = p2;
return *pn1 - *pn2;
}
// 总成绩降序函数
int comp_stu_by_score(const void *p1,const void *p2){
const Stu *ps1 = p1;
const Stu *ps2 = p2;
return (ps2->score[0]+ps2->score[1]+ps2->score[2]) - (ps1->score[0]+ps1->score[1]+ps1->score[2]);
}
int main(){
int arr[] = {
1,5,9,6,7,4,8,3,2,0};
sort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),compare);
int i;
for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++){
printf("%d ",arr[i]);
}
printf("\n\n");
Stu stus[] = {
{
110,"刘备",{
100,80,90}},
{
120,"关羽",{
90,81,92}},
{
130,"张飞",{
99,84,88}},
{
140,"马超",{
70,99,95}},
{
150,"赵云",{
87,78,93}},
{
160,"黄忠",{
98,82,98}},
{
170,"曹操",{
100,100,100}}
};
sort(stus,sizeof(stus)/sizeof(stus[0]),sizeof(Stu),comp_stu_by_score);
for(i=0;i<sizeof(stus)/sizeof(stus[0]);i++){
int sum = stus[i].score[0]+stus[i].score[1]+stus[i].score[2];
printf("%d %s %d %d %d %d\n",stus[i].no,stus[i].name,stus[i].score[0],stus[i].score[1],stus[i].score[2],sum);
}
return 0;
}
C语言小笔记——万能排序
猜你喜欢
转载自blog.csdn.net/LUCAS004/article/details/107741717
今日推荐
周排行