冒泡、插入排序(通用类型版)
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 *));
#endifbubble_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 编辑 ]










