C语言小笔记——万能排序

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/LUCAS004/article/details/107741717