题目:模仿qsort的功能实现一个通用的冒泡排序。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct S
{
char name[10];
float score;
}stu;
int cmp(const void*n1, const void*n2)
{
return *(int*)n1 - *(int*)n2;
}
int struct_cmp(const void *elem1, const void *elem2)
{
return (*(stu *)elem1).score - (*(stu *)elem2).score;
}
int str_cmp(const void *elem1, const void *elem2)
{
return strcmp((char *)*(int *)elem1, (char *)*(int *)elem2);
}
void swap(char *buf1, char* buf2, int width)
{
int i = 0;
for (i = 0; i < width; i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
void bubble_sort(void *base, int len, int width, int(*cmp)(const void* n1, const void*n2))
{
int i = 0;
for (i = 0; i < len - 1; i++)
{
int j = 0;
for (j = 0; j < len - 1 - i; j++)
{
int ret = cmp(((char*)base + (j*width)), ((char*)base + (j + 1)*width));
if (ret>0)
{
swap(((char*)base + (j*width)), ((char*)base + (j + 1)*width), width);
}
}
}
}
int main()
{
int arr[] = {1,2,3,4,6,7,8};
int len = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,len, sizeof(arr[0]), cmp);
int i = 0;
for (i = 0; i <len; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
char arr1[] = { 'a', 'l', 'm', 'x', 'g','h','c' };
int len1 = sizeof(arr1) / sizeof(arr1[0]);
bubble_sort(arr1, len1, sizeof(arr1[0]), cmp);
for (i = 0; i < len1; i++)
{
printf("%c ", arr1[i]);
}
printf("\n");
stu arr2[] = { { "圆圆", 98.0 }, { "冉冉", 97.0 }, { "天天", 96.0 }, { "雯雯", 99.0 } };
int len2 = sizeof(arr2) / sizeof(arr2[0]);
bubble_sort(arr2, len2, sizeof(stu), struct_cmp);
for (i = 0; i < len2; i++)
{
printf("%s %f ", arr2[i].name, arr2[i].score);
}
printf("\n");
char *arr3[] = { "aaa", "dddd", "cccc", "bbbb" };
int len3 = sizeof(arr3) / sizeof(arr3[0]);
bubble_sort(arr3, len3, sizeof(char *), str_cmp);
for (i = 0; i < len3; i++)
{
printf("%s ", arr3[i]);
}
printf("\n");
system("pause");
return 0;
}