任意类型排序

来源:互联网 发布:dat文件导入数据库 编辑:程序博客网 时间:2024/05/16 19:47

模拟qsort()函数,实现任意类型排序:

 qsort()简介:

 原型:

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 )

base:要排序的的数组的首地址


num:要排序的元素的个数


width:元素所占的字节数


compare:函数指针,指向排序方式这个函数的指针。其中比较方式这个函数需要用户根据自己的需要


使用qsort要调用<stdlib.h>


实现:

#include<stdio.h>#include<stdlib.h>int compare(const void *elem1, const void *elem2)   //比较方式{const int *str1 = (const int *)elem1;const int *str2 = (const int *)elem2;return *str1>*str2;                         //">"升序,“<"降序}void sort(void *base, size_t num,size_t byte, int(*cmp)(const void *elem1, const *elem2)){char *str = (char *)base;int flag = 0;const void *p1;const void *p2;for (size_t i = 0; i < num - 1; i++){flag = 0;for (size_t j = 0; j < num - 1 - i; j++){           p1 =(const void *)(str+(j*byte));           p2 = (const void *)(str+(j + 1)*byte);           if (cmp(p1,p2))   {      for (size_t k = 0; k < byte; k++)           //按字节交换      {str[j*byte + k] = str[j*byte + k] + str[(j + 1)*byte + k];str[(j+1)*byte + k] = str[j*byte + k] - str[(j + 1)*byte + k];str[j*byte + k] = str[j*byte + k]-str[(j + 1)*byte + k];      }      flag = 1;}}if (!flag)break;}}int main(){int(*cmp)(const void *elem1, const *elem2)=compare;int arr[4] = { 20,40,5, 4 };sort(arr,4,4, cmp);for (int i = 0; i < 4; i++){printf("%d ", arr[i]);}printf("\n");system("pause");return 0;}
0 0
原创粉丝点击