1 先写个int型数组排序的
1.1 排序方向枚举
typedef enum tag_SortMode{
SORT_MODE_UP,
SORT_MODE_DOWN,
}SortMode;
1.2 冒泡排序函数实现
void BubbleSort(int *arr, uint8_t len, SortMode mode)
{
uint8_t i,j;
for(i = 0; i < len - 1; i++){
for(j = 0; j < len - i - 1; j++){
if(mode == SORT_MODE_UP){
if(arr[j] > arr[j+1]){
swap(&arr[j], &arr[j+1], sizeof(int));
}
}else{
if(arr[j] < arr[j+1]){
swap(&arr[j], &arr[j+1], sizeof(int));
}
}
}
}
}
1.3 测试用例
int aInt[] = {-25,100,-1,6,4,0,-1,255, 12, 0};
void print_aInt(int *arr, uint8_t len)
{
uint8_t i;
for(i = 0; i < len; i++){
printf("|%3d", arr[i]);
if(i%8 == 7){
printf("|\r\n");
}
}
if(i%8 != 0){
printf("|\r\n");
}
}
int main(int argc, char **argv)
{
print_aInt(aInt, sizeof(aInt)/sizeof(int));
BubbleSort(aInt, sizeof(aInt)/sizeof(int), SORT_MODE_UP);
print_aInt(aInt, sizeof(aInt)/sizeof(int));
return 0;
}
2 泛型编程实现
2.1 排序方向枚举
typedef enum tag_SortMode{
SORT_MODE_UP,
SORT_MODE_DOWN,
}SortMode;
2.2 泛型版冒泡排序函数实现
void BubbleSort(void *arr, uint8_t len, uint8_t elemSize,
int (*cmpFn)(void *, void *),
SortMode mode)
{
uint8_t i,j;
void *elem1Addr;
void *elem2Addr;
for(i = 0; i < len - 1; i++){
for(j = 0; j < len - i - 1; j++){
elem1Addr = (char *)arr + j * elemSize;
elem2Addr = (char *)elem1Addr + elemSize;
if(mode == SORT_MODE_UP){
if(cmpFn(elem1Addr, elem2Addr) > 0){
swap(elem1Addr, elem2Addr, sizeof(int));
}
}else{
if(cmpFn(elem1Addr, elem2Addr) < 0){
swap(elem1Addr, elem2Addr, sizeof(int));
}
}
}
}
}
int IntCmp(void *elem1, void *elem2)
{
int *i1 = (int *)elem1;
int *i2 = (int *)elem2;
return (*i1 - *i2);
}
int FloatCmp(void *elem1, void *elem2)
{
uint8_t reval;
float *f1 = (float *)elem1;
float *f2 = (float *)elem2;
if((*f1 - *f2) > 0){
return 1;
}else if((*f1 - *f2) < 0){
return -1;
}else{
return 0;
};
}
int StrCmp(void *elem1, void *elem2)
{
char *f1 = *(char **)elem1;
char *f2 = *(char **)elem2;
return strcmp(f1, f2);
}
2.3 测试用例
int aInt[] = {-25,100,-1,6,4,0,-1,255, 12, 0};
float aFloat[] = {5.2,2.1,-9.5,1.21,1.2,-6,52.3,70};
char *aStr[] = {
"abc",
"ab",
"a",
"abcd",
"a",
"abcdefg",
"abcde"
};
void print_aInt(int *arr, uint8_t len)
{
uint8_t i;
for(i = 0; i < len; i++){
printf("|%3d", arr[i]);
if(i%8 == 7){
printf("|\r\n");
}
}
if(i%8 != 0){
printf("|\r\n");
}
}
void print_aFloat(float *arr, uint8_t len)
{
uint8_t i;
for(i = 0; i < len; i++){
printf("|%5.2f", arr[i]);
if(i%8 == 7){
printf("|\r\n");
}
}
if(i%8 != 0){
printf("|\r\n");
}
}
void print_aStr(char **arr, uint8_t len)
{
uint8_t i;
for(i = 0; i < len; i++){
printf("|%s", arr[i]);
if(i%8 == 7){
printf("|\r\n");
}
}
if(i%8 != 0){
printf("|\r\n");
}
}
int main(int argc, char **argv)
{
print_aInt(aInt, sizeof(aInt)/sizeof(int));
BubbleSort(aInt, sizeof(aInt)/sizeof(int), sizeof(int), IntCmp, SORT_MODE_UP);
print_aInt(aInt, sizeof(aInt)/sizeof(int));
printf("float bubble sort test --------\r\n");
print_aFloat(aFloat, sizeof(aFloat)/sizeof(float));
BubbleSort(aFloat, sizeof(aFloat)/sizeof(float), sizeof(float), FloatCmp, SORT_MODE_UP);
print_aFloat(aFloat, sizeof(aFloat)/sizeof(float));
printf("strings bubble sort test --------\r\n");
print_aStr(aStr, sizeof(aStr)/sizeof(char *));
BubbleSort(aStr, sizeof(aStr)/sizeof(char *), sizeof(char *), StrCmp, SORT_MODE_DOWN);
print_aStr(aStr, sizeof(aStr)/sizeof(char *));
return 0;
}