博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
常规排序算法C语言实现- linux、GCC
阅读量:2029 次
发布时间:2019-04-28

本文共 6751 字,大约阅读时间需要 22 分钟。

Table of Contents


sort.h

#ifndef __CRTL_SORT_H#define __CRTL_SORT_H 1#include "crtl/crtl_types.h"void crtl_sort_cocktailshaker(void *base, size_t num, size_t size, int (*cmp)(const void *, const void *));void crtl_sort_heap(void *base, size_t num,size_t size, int (*cmp)(const void *, const void *));void crtl_sort_insertion(void *base, size_t num, size_t size, int (*cmp)(const void *, const void *));void crtl_sort_qsort3way(void *base, size_t n, size_t size, int (*cmp)(const void *, const void *));void crtl_sort_qsortH(void *base,size_t lo,size_t hi,size_t size,int (*cmp)(const void *, const void *));void crtl_sort_qsortL(void *base,size_t lo,size_t hi,size_t size,int (*cmp)(const void *, const void *));void crtl_sort_selection(void *base,size_t num,size_t size,int (*cmp)(const void *, const void *));void crtl_sort_shell(void *base,size_t num,size_t size,int (*cmp)(const void *, const void *));#endif /*<__CRTL_SORT_H>*/

sort.c

#include "crtl/crtl_log.h"#include "crtl/crtl_assert.h"#include "crtl/crtl_types.h"#include "crtl/crtl_alloc.h"#include "crtl/crtl_string.h"#include "crtl/easy/macro.h"void crtl_sort_cocktailshaker(void *base, size_t num, size_t size, int (*cmp)(const void *, const void *)){    crtl_byte *pbBase = (crtl_byte *)base;    size_t i;    int swapped;    if(num) {        do {            swapped = false;            for(i = 0; i < num - 2; i++)                if(cmp(pbBase + (i + 1) * size, pbBase + i * size) > 0) {                    crtl_memswap(pbBase + (i + 1) * size, pbBase + i * size, size);                    swapped = true;                }            if(!swapped) break;            swapped = false;            for(i = num - 2; i > 0; i--)                if(cmp(pbBase + (i + 1) * size, pbBase + i * size) > 0) {                    crtl_memswap(pbBase + (i + 1) * size, pbBase + i * size, size);                    swapped = true;                }        } while(swapped);    }}void crtl_sort_heap(void *base, size_t num,size_t size, int (*cmp)(const void *, const void *)){    crtl_byte *pbBase = (crtl_byte *)base;    int i = (num / 2 - 1) * size;    int n = num * size;    int c, r;    while(i >= 0) {        for(r = i; r * 2 + size < n; r = c) {            c = r * 2 + size;            if(c < n - size && cmp(pbBase + c, pbBase + c + size) >= 0) c += size;            if(cmp(pbBase + r, pbBase + c) < 0) break;            crtl_memswap(pbBase + r, pbBase + c, size);        }        i -= size;    }    for(i = n - size; i > 0; i -= size) {        crtl_memswap(pbBase, pbBase + i, size);        for(r = 0; r * 2 + size < i; r = c) {            c = r * 2 + size;            if(c < i - size && cmp(pbBase + c, pbBase + c + size) >= 0) c += size;            if(cmp(pbBase + r, pbBase + c) < 0) break;            crtl_memswap(pbBase + r, pbBase + c, size);        }    }}void crtl_sort_insertion(void *base, size_t num, size_t size, int (*cmp)(const void *, const void *)){    crtl_byte *pbBase = (crtl_byte *)base;    size_t i, j;    if(num)        for(i = 1; i < num; i++)            for(j = i; j > 0 && cmp(pbBase + j * size, pbBase + (j - 1) * size) > 0; j--)                crtl_memswap(pbBase + j * size, pbBase + (j - 1) * size, size);}void crtl_sort_qsort3way(void *base, size_t n, size_t size, int (*cmp)(const void *, const void *)){    crtl_byte *ptr = (crtl_byte *)base;    while(n > 1) {        int i = 1, lt = 0, gt = n;        while(i < gt) {            int c = cmp(ptr + lt * size, ptr + i * size);            if(c < 0) {                crtl_memswap(ptr + lt * size, ptr + i * size, size);                lt++;                i++;            } else if(c > 0) {                gt--;                crtl_memswap(ptr + i * size, ptr + gt * size, size);            } else {                i++;            }        }        if(lt < n - gt) {            crtl_sort_qsort3way(ptr, lt, size, cmp);            ptr += gt * size;            n -= gt;        } else {            crtl_sort_qsort3way(ptr + gt * size, n - gt, size, cmp);            n = lt;        }    }}static size_t __partition(void *base, size_t lo,size_t hi,size_t size,int (*cmp)(const void *, const void *)){    crtl_byte *pbBase = (crtl_byte *)base;    crtl_byte *v = (crtl_byte *)base;    size_t i = lo;    size_t j = hi + 1;    //log_debug("lo = %ld, hi = %ld\n", lo, hi);    while(true)     {        while(cmp(pbBase + (++i) * size, v + lo * size) > 0)            if(i == hi) break;        while(cmp(v + lo * size, pbBase + (--j) * size) > 0)            if(j == lo) break;        if(i >= j) break;                crtl_memswap(pbBase + i * size, pbBase + j * size, size);    }    crtl_memswap(pbBase + lo * size, pbBase + j * size, size);    //log_debug("\n");        return j;}void crtl_sort_qsortH(void *base,size_t lo,size_t hi,size_t size,int (*cmp)(const void *, const void *)){    size_t p;    if((long)hi <= (long)lo)    {        return;    }    else     {        p = __partition(base, lo, hi, size, cmp);        crtl_sort_qsortH(base, lo, p - 1, size, cmp);        crtl_sort_qsortH(base, (p + 1), hi, size, cmp);    }}static size_t __LomutoPartition(void *base,size_t lo,size_t hi,size_t size,int (*cmp)(const void *, const void *)){  crtl_byte *ptr = (crtl_byte *)base;  crtl_byte *p = ptr + hi * size;  int i = lo - 1;  size_t j;  for(j = lo; j < hi; j++)    if(cmp(ptr + j * size, p) > 0)      crtl_memswap(ptr + (++i) * size, ptr + j * size, size);  crtl_memswap(ptr + (i + 1) * size, ptr + j * size, size);  return i + 1;}void crtl_sort_qsortL(void *base,size_t lo,size_t hi,size_t size,int (*cmp)(const void *, const void *)){    size_t p;    if((long)hi <= (long)lo)        return;    else {        p = __LomutoPartition(base, lo, hi, size, cmp);        crtl_sort_qsortL(base, lo, p - 1, size, cmp);        crtl_sort_qsortL(base, (p + 1), hi, size, cmp);    }}void crtl_sort_selection(void *base,size_t num,size_t size,int (*cmp)(const void *, const void *)){    crtl_byte *pvBase = (crtl_byte *)base;    size_t i, j;    size_t m;    if(num) {        for(i = 0; i < num; i++) {            m = i;            for(j = i + 1; j < num; j++)                if(cmp(pvBase + j * size, pvBase + m * size) > 0)                     m = j;            crtl_memswap(pvBase + i * size, pvBase + m * size, size);        }    }}void crtl_sort_shell(void *base,size_t num,size_t size,int (*cmp)(const void *, const void *)){    crtl_byte *pbBase = (crtl_byte *)base;    size_t i, j;    size_t h = 1;    if(num) {        while(h < num / 3)            h = 3 * h + 1;        while(h >= 1) {            for(i = 1; i < num; i++)                for(j = i; j > 0 && cmp(pbBase + j * size, pbBase + (j - 1) * size) > 0; j--)                    crtl_memswap(pbBase + j * size, pbBase + (j - 1) * size, size);            h /= 3;        }    }}

 

转载地址:http://mbpaf.baihongyu.com/

你可能感兴趣的文章
北京交通大学万怀宇:时空交通数据预测方法及应用
查看>>
直播预告:多领域端到端任务型对话系统研究分享 | AI TIME PhD对话系统专题第七期...
查看>>
让文创作品“活”起来、“火”起来,AI是否将颠覆新文创?
查看>>
利用自监督学习的放端故事生成评价方法
查看>>
哈尔滨工业大学博士覃立波:多领域端到端任务型对话系统研究分享
查看>>
倒计时2天-线下报名|论道火爆AI圈的GPT-3
查看>>
数据重生:让神经机器翻译中的不活跃样本“复活”
查看>>
NeurlPS 2020来啦!AI TIME PhD 顶会专场直播预告
查看>>
直播预告: NeurlPS 2020 专场二| AI TIME PhD
查看>>
重要通知!!!
查看>>
当强化学习遇上循环神经网络:从System 1到System 2 Deep Learning
查看>>
AI时代,智慧图书馆该如何重构?| AI TIME
查看>>
隐私保护与生成模型: 差分隐私GAN的梯度脱敏方法
查看>>
基于强化学习的中间商赚差价指导手册
查看>>
基于深度特征分解的红外和可见光图像融合
查看>>
直播预告:AAAI 2021专场一| AI TIME PhD
查看>>
一种基于Transformer解码端的高效子层压缩方法
查看>>
同一种方法,同一句话,翻译成英语和泰语,差别为什么这么大?
查看>>
弱监督、具有可解释性的应用题解答
查看>>
前序、中序、后序递归、非递归方式打印二叉树
查看>>