首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

对纯数目字的高效排序算法

2012-10-29 
对纯数字的高效排序算法通过位操作或数组操作,一次扫描,一次赋值即可完成,对于数据量巨大,数据范围较小的

对纯数字的高效排序算法

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

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

?

/** * @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 1int 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

??

热点排行