实现一个通用的冒泡排序

1.实现一个通用的冒泡排序。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct Ass//结构体
{
	int age;
	char name[10];
	double grade;
	char c;
};

void Swap(void *p, void *q, int j)//交换
{
	int i = 0;
	for(i = 0; i < j; i++)
	{
		char tmp = *((char*)p+i);
		*((char*)p+i) = *((char*)q+i);
		*((char*)q+i) = tmp;
	}
}

int Cmp_ass_age(const void *p, const void *q)//结构体里的整形比较
{
	return ((struct Ass*)p)->age - ((struct Ass*)q)->age;
}

int Cmp_ass_grade(const void *p, const void *q)//结构体里的浮点型比较
{
	return ((struct Ass*)p)->grade > ((struct Ass*)q)->grade;
}

int Cmp_ass_name(const void *p, const void *q)//结构体里的字符串比较
{
	return strcmp((*(struct Ass*)p).name,(*(struct Ass*)q).name);
}

int Cmp_int(const void *p, const void *q)//整形比较
{
	return *(int *)p - *(int *)q;
}
int Cmp_ass_char(const void *p, const void *q)//结构体中的字符型比较
{
	return ((struct Ass*)p)->c  - ((struct Ass*)q)->c;
}

void My_qsort(void* base, size_t number, size_t sz, int Cmp(const void *si, const void *s2))
{
	size_t i = 0;
	size_t j = 0;
	for(i = 0; i < number-1; i++)
	{
		for(j = 0; j < number - i- 1; j++)
		{
			if(Cmp((char*)base+j*sz, (char*)base+(j+1)*sz) > 0)//升序排序,如果前一个大于后一个就交换这两个元素
			{
				Swap((char*)base+j*sz, (char*)base+(j+1)*sz,sz);
			}
		}
	}
}

int main()
{
	int a[] = {1,3,5,7,9,2,4,6,8,0};
	struct Ass ass[3] = {{21 ,"liucheng",93.9,'a'},{22,"zhanghang", 90.0,'s'},{20,"shengpan", 91.0,'d'}};
	int i = 0;
	My_qsort(ass, sizeof(ass)/sizeof(ass[0]),sizeof(ass[0]),Cmp_ass_char);

	//输出
	for(i = 0; i < sizeof(ass)/sizeof(ass[0]); i++)
	{
		printf("%s ", ass[i].name);
	}
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ksaila/article/details/80303780