算法学习笔记之排序--基于值的插入排序

/*
 * main.c
 *
 *  Created on: 2010-10-27
 *      Author: Jenson
 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int fncmp(const void * a, const void * b);
void insert_sort(void * arr, int n, int s, int(*cmp)(const void *,
        const void *));
int main() {
    int * arr[6] = { 3, -2, 5, 7, 0 ,8};
    int (*cmp)(const void *,const void *) = &fncmp;
    insert_sort(arr,6,sizeof(int *),cmp);
    int i;
    printf("\n");
    for(i = 0;i<6;i++){
        printf("%d\t",*(arr+i));
    }
    return 0;
}

int fncmp(const void *a, const void *b) {
    int *aa = a;
    int *bb = b;
    printf("%d,%d\t",*aa,*bb);
    if (*aa > *bb) {
        return 1;
    } else if (*aa == *bb) {
        return 0;
    } else {
        return -1;
    }
}

/**
 * 当arr是基于值存储时,这个数组被装入n行,并且分配给它一个固定的大小的内存s。
 * 使用比较函数对值进行比较,也就是将值从一个位置复制到另一个位置
 */
void insert_sort(void * arr, int n, int s,
        int(*cmp)(const void *, const void *)) {

    int j;
    void *saved = malloc(s);
    for (j = 1; j < n; j++) {
        int i = j - 1;
        void * value = arr + j * s;
        /*从末尾开始遍历,直到i<0或者找到一个相比较小的元素*/
        while (i >= 0 && cmp(arr + i * s, value) > 0) {
            i--;
        }
        /*如果已经在其正确位置,那么就没有必要移动,
         * 否则保存将插入的值并且移动这一大块内存,将其插入到适当的位置
         */
        if (++i == j) {
            continue;
        }
        memmove(saved, value, s);
        memmove(arr + (i + 1) * s, arr + i * s, s * (j - i));
        memmove(arr + i * s, saved, s);
    }

    free(saved);
}

你可能感兴趣的:(算法,职场,休闲)