这里我们实在冒泡排序的基础上去实现的
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
typedef struct Studentr
{
char name[30];
int age;
}b;
typedef struct Student
{
char name[30];
int age;
}S;
typedef struct Studente
{
char name[30];
int age;
}c;
//比较函数
int compar(const void* e1, const void* e2)
{
//return *(int*)e2 - *(int*)e1;
return strcmp(((struct Student*)e1)->name, ((struct Student*)e2)->name);
//return *((struct Student*)e1)->name, *((struct Student*)e2)->name;//错误字符不能直接相减(给我们一个正确结果是因为他们地址连在一起了,我们在创建两个结构体c和b他们内存不想连,这个结果就是错的了)
//return ((struct Student*)e1)->age - ((struct Student*)e2)->age;
}
void Swap(char* e1, char* e2,int size)
{
//交换
int n = 0;
int* num = NULL;
for ( n = 0; n < size; n++)//小于宽度
{
num = *e1;
*e1 = *e2;
*e2 = num;
e1++;
e2++;
}
}
void My_qsort(void* arr, size_t sz, size_t size, int (*compar)(const void* e1, const void* e2))
{
int i = 0;
for ( i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
//冒泡改任意排序
//int ret = compar((char*)arr + j * size, (char*)arr + (j + 1) * size);
if (compar((char*)arr + j * size, (char*)arr + (j + 1) * size)>0)//
{
//交换 一个一个字符交换
Swap((char*)arr + j * size, (char*)arr + (j + 1) * size, size);
}
}
}
}
void Print(struct Student* arr, int sz)
{
//打印
int i = 0;
for ( i = 0; i < sz; i++)
{
printf("%s %d \n", arr[i].name, arr[i].age);
}
}
int main()
{
//int arr[10] = { 1,3,5,7,9,2,4,6,8,10 };
//int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//int sz = sizeof(arr) / sizeof(arr[0]);
/*char arr[] = "sdhfj";
int sz = strlen(arr);*/
S s1 = { "zhangsan",18 };
S s2 = { "li",22 };
S s3 = { "wangwu",34 };
struct Student arr[] = { s1,s2,s3 };
int sz = sizeof(arr) / sizeof(arr[0]);
My_qsort(arr, sz, sizeof(arr[0]), compar);
Print(arr, sz);
return 0;
}