对纯数字的高效排序算法

通过位操作或数组操作,一次扫描,一次赋值即可完成,对于数据量巨大,数据范围较小的应用具有最大的运行效率。

在实际应用场合,最大值和最小值可以直接填写而不通过函数获取。

 

/**
 * @file sort.c
 * @brief 对所有元素都为正整数的数组进行排序
 * @defgroup sort
 * @{
 */
#include <stdio.h>

/** @brief 位设置 */
static void bit_set(char *tmp, int pos)
{
    if (NULL == tmp || pos < 0)
        return;
    int n = pos / 8;
    int mov = pos % 8;
    tmp += n;
    *tmp |= 1 << mov;
}
/** @brief 位比较 */
static int bit_cmp(char *tmp, int pos)
{
    if (NULL == tmp || pos < 0)
        return;
    int n = pos / 8;
    int mov = pos % 8;
    tmp += n;
    return (*tmp & 1 << mov);
}

/**
 * @brief 对所有元素都不同的数组进行排序,要求数组所有元素为正整数。
 * @param  arr  等待排序的数组
 * @param  len  数组长度
 * @param[in]  min  数组中最小可能出现的最小值
 * @param[in]  max  数组种最大可能出现的最大值
 * @return 无
 */
void sort_diff_num(int *arr, int len, int min, int max)
{
    if (NULL == arr || min < 0)
        return;
    int i, j;
    int range = max - min + 1;
    char tmp[range / 8 + 1];
    memset(tmp, 0, sizeof tmp);
    for (i=0; i<len; i++) {
        bit_set(tmp, arr[i]-min);
    }
    for (i=0,j=0; i<range; i++) {
        if (bit_cmp(tmp, i)) {
            arr[j] = i+ min;
            printf("arr[%d] = %d\n", j, i+min);
            j++;
        }
    }
}

/**
 * @brief 对可能出现重复值的数组进行排序,要求数组所有元素为正整数。
 * @param  arr  等待排序的数组
 * @param  len  数组长度
 * @param[in]  min  数组中最小可能出现的最小值
 * @param[in]  max  数组种最大可能出现的最大值
 * @return 无
 */
int sort_repe_num(int *arr, int len, int min, int max)
{
    if (NULL == arr || min < 0)
        return;
    int i, j, k;
    int range = max - min + 1;
    int tmp[range];
    memset(tmp, 0, sizeof tmp);
    for (i=0; i<len; i++) {
        tmp[arr[i]]++;
    }
    for (i=0,j=0; i<range; i++) {
        for (k=0; k<tmp[i]; k++) {
            arr[j] = i+ min;
            printf("arr[%d] = %d\n", j, i+min);
            j++;
        }
    }
}

int get_max_num(int arr[], int len)
{
    int i, max = 0;
    for (i=0; i<len; i++)
        max = max > arr[i] ? max : arr[i];
    return max;
}

int get_min_num(int arr[], int len)
{
    int i, min = 0;
    for (i=0; i<len; i++)
        min = min < arr[i] ? min : arr[i];
    return min;
}

/** @} */

#if 1
int main(int argc, char **argv)
{
    int array_num[] = {1, 4, 12, 4, 3};
    int array_len = sizeof array_num / sizeof (int);
    int i;
    for (i=0; i<array_len; i++) 
        printf("%d ", array_num[i]);
    printf("\n");
    sort_repe_num(array_num, array_len, 
                get_min_num(array_num, array_len),
                   get_max_num(array_num, array_len));
    for (i=0; i<array_len; i++) 
        printf("%d ", array_num[i]);
    printf("\n");
}
#endif

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值