`

对纯数字的高效排序算法

阅读更多

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

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

 

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

  

分享到:
评论

相关推荐

    最快的排序算法 计算机最快的算法-史上14个最快速算法:孩子的计算能力爆表!大脑堪比计算机!...,排序算法数据结构

    基数排序算法是一种高效的排序算法,它的工作原理是通过将数组按照数字的每个位数排序,以达到排序的目的。基数排序算法的时间复杂度为O(nk),因此它适合大规模的数据排序。 9.桶排序算法 桶排序算法是一种高效的...

    数字排序算法

    快速排序是一种非常高效的排序算法,采用分而治之的思想,通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。...

    VB 排序 简单排序 文本框取数字排序 字符串取数字排序

    在这个主题中,我们将深入探讨VB中的简单排序算法,特别是如何处理文本框中的数字排序以及从字符串中提取数字进行排序。 1. **简单排序算法**: - **冒泡排序**:是最基础的排序方法,通过不断地比较相邻元素并...

    排序及基本算法

    5. **基数排序**:基数排序是一种非比较型整数排序算法,其原理类似于人们手工排序扑克牌的过程。它按位数从低位到高位进行排序,适用于固定长度的整数排序。 #### 三、排序算法的比较与选择 不同的排序算法在时间...

    易语言脚本数字排序

    易语言脚本数字排序的源码不仅提供了一个学习的基础,也让我们有机会去改进和优化算法,例如采用更高效的排序算法,或者加入多线程处理以提高排序速度。 总之,易语言脚本数字排序是编程入门阶段的重要学习内容,它...

    实现所有经典排序算法汇总

    它通过将待排序的数组元素按某个增量分组,对每组使用直接插入排序算法排序,然后逐渐减少增量,直到增量为1,整个数组成为一个有序序列。 6. **归并排序(Merge Sort)** 归并排序是一种分治的排序算法,将待排序的...

    5大排序算法

    Hoare提出的,也是基于分治策略的一种高效排序算法。选取一个“基准”元素,将数组分为两部分:一部分所有元素都小于基准,另一部分所有元素都大于基准,然后递归地对这两部分进行快速排序。快速排序的平均时间...

    十大排序算法.pdf

    基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。具体算法实现如下:从最低位开始,依次对每一位数字进行排序。这样从最低位到最高位排序完成以后,数列就变成...

    数据结构实验-排序算法

    4. **基数排序**:基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。基数排序可以处理大量数据,并且稳定,但不适合小规模或者非整数的排序。 5. **快速排序**...

    总结了各种排序算法,并用C++代码实现,并有演示

    在实际应用中,要根据数据特性选择合适的排序算法,例如,如果数据近乎有序,插入排序可能会更高效;大数据量时,快速排序和归并排序往往是首选;而对于小规模数据,简单的排序算法如冒泡排序或选择排序也能接受。 ...

    java源码数字字符串排序

    本示例着重讨论如何对百万级的数字字符串进行高效排序。标题中的“java源码数字字符串排序”指的是利用Java语言实现的一种优化策略,可能针对特定场景比快速排序算法更快。描述中提到的“可能需要增加Java虚拟机内存...

    C++ 排序算法大全

    在编程领域,排序算法是...而对于大规模或性能敏感的应用,高效排序算法如快速排序和归并排序更为适用。在C++中,可以利用STL库中的`std::sort`函数,它采用了高效的排序算法,但了解底层的排序原理仍然非常有价值。

    冒泡,折半等排序算法

    本资源集合包含多种经典的排序算法实现,包括冒泡排序、折半排序以及一些其他高效的排序方法。下面,我们将详细探讨这些排序算法的原理、特点和应用。 **1. 冒泡排序(Bubble Sort)** 冒泡排序是最基础的排序算法...

    用javascript实现的十大排序算法详解

    快速排序是基于分治策略的高效排序算法。选取一个“基准”元素,然后将数组分为两部分,一部分所有元素小于基准,另一部分所有元素大于基准。递归地对这两部分进行快速排序,最后达到整个数组有序。 5. 归并排序...

    C#排序算法(C#)

    在编程领域,排序算法是数据结构与算法中的基础部分,对于C#开发者来说,掌握不同的排序算法至关重要。本文将深入探讨C#语言中常见的几种排序算法,包括它们的工作原理、性能特点以及如何在C#代码中实现。 1. **...

    java八大排序算法

    - 快速排序是一种高效的排序算法,由C.A.R. Hoare在1960年提出。其基本思想是采用分治法,选取一个基准元素,将数组分为两个子数组,左边的元素都小于基准,右边的元素都大于基准,然后递归地对子数组进行快速排序...

    数据结构课程设计(内部排序算法比较_C语言)

    - **简单选择排序**虽然实现简单,但在大多数情况下不如其他高级排序算法高效。 - **快速排序**和**堆排序**在平均情况下都表现出较高的效率,尤其是对于大数据量的排序任务。 - **希尔排序**通过引入增量提高了插入...

    Java冒泡排序算法

    ### Java冒泡排序算法知识点详解 #### 一、冒泡排序基本...总结而言,冒泡排序虽然不是最高效的排序算法,但它简洁明了的逻辑使其成为学习和教学中的经典案例。对于小规模的数据集,冒泡排序仍然有一定的实用价值。

    排序算法的比较 10 种排序算法的代码都有 冒泡比较快速等等

    下面将对这些排序算法进行详细介绍。 1. **冒泡排序**:这是一种简单的排序算法,通过不断交换相邻的错误顺序元素来逐步排序。它的主要思想是重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把...

    JAVA排序算法集合

    归并排序是一种采用分治法的高效排序算法,其基本思想是将数组分成两半,对每一半进行排序,然后将它们合并成一个有序数组。 **时间复杂度**: - 最好情况:O(n log n); - 平均情况:O(n log n); - 最坏情况:O(n...

Global site tag (gtag.js) - Google Analytics