首页 > 代码库 > C和指针第13章第4题
C和指针第13章第4题
题目:编写一个函数,它用于对一个任何类型的数组进行排序。
算法核心代码sort函数实现
/**功能说明:sort函数可以对不同类型的数据进行排序参数:1、一个指向需要排序的数组的第一个值的指针。2、数组中元素的个数。 3、每个数组元素的长度。4、一个指向比较回调函数的指针 **/void sort(void *array,int size,int element_size,int (*cmp)(void const *a,void const *b)){ char *pc = (char *)array;//默认void *大小未知,这里把它存入字符指针下 //简单的冒泡排序 这里可以用更高级的算法实现,这里采用了简单的冒泡排序 for(int i = 0; i < size; i++) for(int j = 1; j < size-i; j++) { if(cmp(pc+(j-1)*element_size,pc+j*element_size) < 0) { void *p = malloc(element_size);//分配一个string大小的内存 //交换两个元素,借助于和中间变量p,由于具体类型未知,这里借助于内存cpy函数拷贝内存内的内容 memcpy(p,pc+j*element_size,element_size); memcpy(pc+j*element_size,pc+(j-1)*element_size,element_size); memcpy(pc+(j-1)*element_size,p,element_size); free(p);//临时变量使用完毕后,记得释放,不然容易造成内存泄露 } }}
字符串比较函数,这里是第二个大于第一个返回值大于0,相等等于0,第二个数小于第一个返回值小于0
//string 比较int string_cmp(void const *a,void const *b){ char *num1 = (char *)a; char *num2 = (char *)b; assert(num1 != NULL && num2 != NULL); while(*num1 != ‘\0‘ && *num2 != ‘\0‘) { if(*num1 == *num2) { num1++; num2++; continue; } break; } return *num2-*num1;}
测试代码,全部代码
/************************************************************************* > File Name: sort.c > Created Time: 2014年06月17日 星期二 23时22分34秒 ************************************************************************/#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>/**功能说明:sort函数可以对不同类型的数据进行排序参数:1、一个指向需要排序的数组的第一个值的指针。2、数组中元素的个数。 3、每个数组元素的长度。4、一个指向比较回调函数的指针 **/void sort(void *array,int size,int element_size,int (*cmp)(void const *a,void const *b)){ char *pc = (char *)array;//默认void *大小未知,这里把它存入字符指针下 //简单的冒泡排序 这里可以用更高级的算法实现,这里采用了简单的冒泡排序 for(int i = 0; i < size; i++) for(int j = 1; j < size-i; j++) { if(cmp(pc+(j-1)*element_size,pc+j*element_size) < 0) { void *p = malloc(element_size);//分配一个string大小的内存 //交换两个元素,借助于和中间变量p,由于具体类型未知,这里借助于内存cpy函数拷贝内存内的内容 memcpy(p,pc+j*element_size,element_size); memcpy(pc+j*element_size,pc+(j-1)*element_size,element_size); memcpy(pc+(j-1)*element_size,p,element_size); free(p);//临时变量使用完毕后,记得释放,不然容易造成内存泄露 } }}//int比较int int_cmp(void const *a,void const *b){ int *num1 = (int *)a; int *num2 = (int *)b; if(*num1 == *num2)return 0; else return *num2-*num1;}//double比较int double_cmp(void const *a,void const *b){ double *num1 = (double *)a; double *num2 = (double *)b; if(*num1 == *num2)return 0; else return *num2-*num1;}//char 比较int char_cmp(void const *a,void const *b){ char *num1 = (char *)a; char *num2 = (char *)b; if(*num1 == *num2)return 0; else return *num2-*num1;}//string 比较int string_cmp(void const *a,void const *b){ char *num1 = (char *)a; char *num2 = (char *)b; assert(num1 != NULL && num2 != NULL); while(*num1 != ‘\0‘ && *num2 != ‘\0‘) { if(*num1 == *num2) { num1++; num2++; continue; } break; } return *num2-*num1;}int main(){ //int 数组 int array[6] = {9,3,5,2,0,4}; printf("int 数组排序前:\n"); for(int i = 0; i < 6; i++) printf("%d ",array[i]); printf("\n"); sort(array,6,sizeof(int),int_cmp); printf("int 数组排序后:\n"); for(int i = 0; i < 6; i++) printf("%d ",array[i]); printf("\n"); //double 数组 double array_d[5] = {3.16,2.5,6.49,10.5,0.4}; printf("double 数组排序前:\n"); for(int i = 0; i < 5; i++) printf("%lf ",array_d[i]); printf("\n"); sort(array_d,5,sizeof(double),double_cmp); printf("double 数组排序后:\n"); for(int i = 0; i < 5; i++) printf("%lf ",array_d[i]); printf("\n"); //char char array_c[5] = {‘E‘,‘C‘,‘A‘,‘D‘,‘B‘}; printf("char 数组排序前:\n"); for(int i = 0; i < 5; i++) printf("%c ",array_c[i]); printf("\n"); sort(array_c,5,sizeof(char),char_cmp); printf("char 数组排序后:\n"); for(int i = 0; i < 5; i++) printf("%c ",array_c[i]); printf("\n"); //string 数组排序 char array_s[5][10] = {"yello","world","herb","herd","sort"}; printf("string 数组排序前:\n"); for(int i = 0; i < 5; i++) printf("%s ",array_s[i]); printf("\n"); sort(array_s,5,sizeof(char)*10,string_cmp); printf("string 数组排序后:\n"); for(int i = 0; i < 5; i++) printf("%s ",array_s[i]); printf("\n"); return 0;}
运行结果:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。