您的位置:首页 > 其它

任意类型排序

2016-05-02 13:09 302 查看
模拟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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  模拟 qsort