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