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