| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1055 人关注过本帖, 2 人收藏
标题:冒泡、插入排序(通用类型版)
只看楼主 加入收藏
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
结帖率:94.64%
收藏(2)
已结贴  问题点数:1 回复次数:14 
冒泡、插入排序(通用类型版)
util.h
程序代码:
#ifndef _UTIL_H_
#define _UTIL_H_

/*
    对data数组中的num个size大小的元素进行插入排序,并给定比较函数compare,
    如果compare第一个参数小于第二个参数,返回负数
    如果compare第一个参数等于第二个参数,返回0
    如果compare第一个参数大于第二个参数,返回正数
*/
void insertion_sort(void * data,
                    unsigned num,
                    unsigned size,
                    int (* compare)(const void *, const void *));

// 交换p1指向和p2指向的size个字节大小数据
void swap(void * p1, void * p2, unsigned size);

/*
    对data数组中的num个size大小的元素进行冒泡排序,并给定比较函数compare,
    如果compare第一个参数小于第二个参数,返回负数
    如果compare第一个参数等于第二个参数,返回0
    如果compare第一个参数大于第二个参数,返回正数
*/
void bubble_sort(void * data,
                 unsigned num,
                 unsigned size,
                 int (* compare)(const void *, const void *));

#endif

bubble_sort.c
程序代码:
#include "util.h"
#include <string.h>
#include <stdlib.h>

void swap(void * p1, void * p2, unsigned size) {
    void * temp = malloc(size);
    memcpy(temp, p1, size);
    memcpy(p1, p2, size);
    memcpy(p2, temp, size);
    free(temp);
}

void bubble_sort(void * data,
                 unsigned num,
                 unsigned size,
                 int (* compare)(const void *, const void *))

 {
    int i, j, flag = 1;
    for(i = 0; i < num && flag; i++) {
        flag = 0;
        for(j = 0; j < num - i - 1; j++) {
            if(compare(data + j * size, data + (j + 1) * size) > 0) {
                swap(data + j * size, data + (j + 1) * size, size);
                flag = 1;
            }
        }
    }
}

insertion_sort.c
程序代码:
#include "util.h"
#include <string.h>
#include <stdlib.h>

void insertion_sort(void * data,
                    unsigned num,
                    unsigned size,
                    int (* compare)(const void *, const void *))
{
    int i, j, k;
    void * temp = malloc(size);
    for(i = 1; i < num; i++) {
        for(j = 0; j < i; j++)
            if(compare(data + j * size, data + i * size) > 0)
                break;
        memcpy(temp, data + i * size, size);
        for(k = i; k > j; k--)
            memcpy(data + k * size, data + (k - 1) * size, size);
        memcpy(data + j * size, temp, size);
    }
    free(temp);
}

test.c
程序代码:
#include <stdio.h>
#include "util.h"

// 可以自己定义一个比较函数,在内部进行转换
int compare(const void * p1, const void * p2) {
    return *(int *)p1 - *(int *)p2;
}

int main(void) {
    int array[10], i;

    // bubble_sort:
    for(i = 0; i < 10; i++)
        scanf("%d", array + i);
    bubble_sort(array, 10, sizeof(int), compare);
    for(i = 0; i < 10; i++)
        printf("%d ", array[i]);

    printf("\n\n");

    // insertion_sort:
    for(i = 0; i < 10; i++)
        scanf("%d", array + i);
    insertion_sort(array, 10, sizeof(int), compare);
    for(i = 0; i < 10; i++)
        printf("%d ", array[i]);
    return 0;
}   /*  output:
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9

9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9
Process returned 0 (0x0)   execution time : 10.016 s
Press any key to continue.
*/

有兴趣的朋友可以拿去用用。

[ 本帖最后由 lz1091914999 于 2011-7-2 10:56 编辑 ]
搜索更多相关主题的帖子: compare 通用 元素 
2011-06-18 11:13
bccn_1234
Rank: 2
等 级:论坛游民
帖 子:22
专家分:13
注 册:2011-6-11
收藏
得分:0 
只能看出你会用void*和函数指针,没觉得你这代码有好的层次感
2011-06-18 11:34
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 2楼 bccn_1234
不知道您觉得现在的层次如何?

My life is brilliant
2011-06-18 11:54
bccn_1234
Rank: 2
等 级:论坛游民
帖 子:22
专家分:13
注 册:2011-6-11
收藏
得分:0 
外行水平
2011-06-18 12:07
liangjinchao
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:376
专家分:697
注 册:2010-11-8
收藏
得分:0 
回复 2楼 bccn_1234
能别套个马甲在这装鬼吗?
收到的鲜花
  • BlueGuy2011-06-18 12:22 送鲜花  45朵   附言:原创内容

因为有了因为,所以有了所以,既然已成既然,何必再说何必
2011-06-18 12:21
bccn_1234
Rank: 2
等 级:论坛游民
帖 子:22
专家分:13
注 册:2011-6-11
收藏
得分:0 
回复 5楼 liangjinchao
提示: 该帖被管理员或版主屏蔽
2011-06-18 12:32
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
这位MM啊,能不能把你的代码帖出来欣赏欣赏,
然后再指教别人呢,。

我就是真命天子,顺我者生,逆我者死!
2011-06-18 12:37
bccn_1234
Rank: 2
等 级:论坛游民
帖 子:22
专家分:13
注 册:2011-6-11
收藏
得分:0 
回复 7楼 BlueGuy
提示: 该帖被管理员或版主屏蔽
2011-06-18 12:47
bccn_1234
Rank: 2
等 级:论坛游民
帖 子:22
专家分:13
注 册:2011-6-11
收藏
得分:0 
提示: 该帖被管理员或版主屏蔽
2011-06-18 12:49
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:1 
像这种无端跑过来表伟大的2b别理他...


[ 本帖最后由 BlueGuy 于 2011-6-18 12:55 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2011-06-18 12:54
快速回复:冒泡、插入排序(通用类型版)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019830 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved