Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7106
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 41
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-28 21:26
个人简介

You're Beautiful

文章分类

全部博文(4)

文章存档

2013年(4)

我的朋友

分类: C/C++

2013-10-31 21:16:35

仿qsort写的原地插入排序,用void *实现各种类型数组的传递,调用是需自己写一个比较数组成员大小的函数
/*
*参数:
*        array:        需排序的数组
*        nmemb:      数组成员数
*        memsize:  每个数组成员的大小
*        compar:    用于比较成员大小的函数

*输出:
*        无返回值,排序后的数组存于原数组中       
*/

void InsertionSortAllType(void *array, size_t nmemb, size_t memsize, int (*compar)(const void *, const void *))
{
        //假定array【i】之前的数组都是已排序的,从array【i-1】向前搜索,找到array【i】应该在的位置,将其插入
        int i, j;
        void *key = malloc(memsize);        //用于暂存array[i]
        for (i = 1; i < nmemb; i++) {
            memcpy(key, array + (i * memsize), memsize);    //存array【i】
            for (j = i - 1; j >= 0; j--) {        
                if (compar(key, array + j * memsize) < 0) {
                    memcpy(array + (j + 1) * memsize, array + j * memsize, memsize);   //从array【i - 1】向前搜索,比key大的向后挪一个位置
                } else
                     break;
            }
            memcpy(array + (j + 1) * memsize, key, memsize); //找到正确位置,插入key
        }
}


//例子
#include  
#include  
#include  "sort.h"


#define     SIZE 8

void Print(char A[]); 
int compare(const void *a, const void *b);

int main(void) 
{
        char A[SIZE];
        int i;
        for (i = 0; i < 8; i++) {
            scanf("%c", &A[i]);
            getchar();
        }

        Print(A);
        InsertionSortAllType(A, SIZE, sizeof(char), compare);
        Print(A);
        return 0;
}

//遍历数组
void Print(char A[]) 
{
        int i;
        for (i = 0; i < SIZE; i++)
             printf("%c ", A[i]);
        printf("\n");
}

//用于比较数组成员大小的函数
int compare(const void *a, const void *b)
{
        if(*(char*)a > *(char*)b)
             return 1;
        else if (*(char*)a == *(char*)b)
             return 0;
        else
             return -1;
}
阅读(160) | 评论(0) | 转发(0) |
1

上一篇:没有了

下一篇:合并排序

给主人留下些什么吧!~~