您的位置:首页 > 职场人生

<笔试><面试>编写一个排序函数,实现,既可以排序整形数组,又可以排序字符串。

2016-06-05 10:57 966 查看
思路:仿照qsort函数运用函数指针实现排序整形数组、排序字符串的功能。

首先,编写整形数组比较函数和字符串比较函数;

其次,仿照qsort函数将首元素地址、元素个数、元素大小、比较函数 传参编写熟悉的冒泡排序函数;

最后,举例验证函数正确性。

/******************************/
//1.编写冒泡排序,可以排序整形数组,也可以排序字符串。

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

void bobble(const void *base, int length, int width, int(*fcmp)(const void *a, const void *b))//(*fcmp)()函数指针
{
assert(base);//断言
int i = 0, j = 0, k = 0;
char *arr = (char *)base;
char temp='\0';
for (i = 0; i < length - 1; i++)
for (j = 0; j < length - i - 1; j++)
{
if ((*fcmp)(arr, arr + width * j)>0)//传参 将该元素地址与下一元素地址传入函数
{
for (k = 0; k < width * j; k++)//运用循环在内存中实现对两元素进行交换
{
temp = *(arr + k);
*(arr + k) = *(arr + k + width * j);
*(arr + k + width * j) = temp;
}
}
}
}

int int_cmp1(const void *a, const void *b)
{
assert(a);
assert(b);
return *(int *)a - *(int *)b;
}

int str_cmp(const void *a, const void *b)
{
assert(a);
assert(b);
char *arr1 = (char *)a;
char *arr2 = (char *)b;
while (*arr1&&*arr2&&*arr1++ == *arr2++)
;
return *(arr1 - 1) - *(arr2 - 1);
}

int main()
{
int str1[] = { 1,5,0,2,4,7,9,6,3,5,6 ,16,155,26};
int size = sizeof(str1) / sizeof(str1[0]);
char str2[][30] = { "abcd","3456","cdef","1234" ,"abce"};
int size_str = sizeof(str2) / sizeof(str2[0]);
int i = 0;
qsort(str1, size, sizeof(str1[0]), int_cmp1);//用快排函数结果作比较
for (i = 0; i < size; i++)
printf("%d ", str1[i]);
printf("\n");
bobble(str1, size, sizeof(str1[0]), int_cmp1);
for (i = 0; i < size; i++)
printf("%d ", str1[i]);
printf("\n");

qsort(str2, size_str, sizeof(str2[0]), str_cmp);//用快排函数结果作比较
for (i = 0; i < size_str; i++)
printf("%s\n", str2[i]);
bobble(str2, size_str, sizeof(str2[0]), str_cmp);
for (i = 0; i < size_str; i++)
printf("%s\n", str2[i]);

system("pause");
return 0;
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: