相对有序排序算法

简介: 使用场景: 当需要对一批数据进行逐个筛选,并将筛选后的数据存入一个容器中,当取出来进行第二次操作时,需要取出的数据是按一定的规则排序的时候。 drools加载并执行规则的时候,会去创建执行网络(Rete算法),用的排序方式就是这个算法。

使用场景:
当需要对一批数据进行逐个筛选,并将筛选后的数据存入一个容器中,当取出来进行第二次操作时,需要取出的数据是按一定的规则排序的时候。
drools加载并执行规则的时候,会去创建执行网络(Rete算法),用的排序方式就是这个算法。

public class RelativeOrderAlgorithm {

    private static Integer[] elements = new Integer[11];
    private static int size = elements.length - 1;

    public static void percolateUpMaxHeap(int index) {
        int hole = index;
        int element;
        int next;
        for (element = elements[index]; hole > 1
                && element - elements[hole / 2] > 0; hole = next) {
            next = hole / 2;
            elements[hole] = elements[next];
        }
        elements[hole] = element;
    }

    public static void percolateDownMaxHeap(int index) {
        int element = elements[index];
        int hole;
        int child;
        for (hole = index; hole * 2 <= size; hole = child) {
            child = hole * 2;
            if (child != size && elements[child + 1] - elements[child] > 0) {
                ++child;
            }
            if (elements[child] - element <= 0) {
                break;
            }
            elements[hole] = elements[child];
        }
        elements[hole] = element;
    }

    public static Integer doRemove(int index) {
        if (index >= 1 && index <= size) {
            int result = elements[index];
            elements[index] = elements[size];
            elements[size] = null;
            --size;
            if (size != 0 && index <= size) {
                int compareToParent = 0;
                if (index > 1) {
                    compareToParent = elements[index] - elements[index / 2];
                }

                if (index > 1 && compareToParent > 0) {
                    percolateUpMaxHeap(index);
                } else {
                    percolateDownMaxHeap(index);
                }
            }
            return result;
        } else {
            return null;
        }
    }

    public static void main(String[] args) {
        int[] arr = { 0, 2, 43, 12, 4356, 54, 23, 231, 32, 554, 67 };
        for (int i = 1; i < arr.length; i++) {
            elements[i] = arr[i];
            percolateUpMaxHeap(i);
        }
        for (int i = 1; i < arr.length; i++) {
            System.out.println(doRemove(1));
        }
    }
}

效率比较:
例如,我们要处理的数据量为10,使用快速排序的方式:

int[] arr = { 1,2,3,4,5,6,7,8,9,10 };
for (int i = 0; i < arr.length-1; i++) {
    for (int j = i+1; j < arr.length; j++) {
        if(arr[i]<arr[j]){
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        count++;
    }
}

我们发现最坏的这种情况需要循环45次,而是用相对有序排序算法只要需要29次,而且,相对有序的算法的优势不仅如此,传统的排序不管是什么情况都需要循环那么多次,而相对有序的算法在是乐观的,很多时候循环的次数是不需要29次的,例如数据本来就是有序的,那么只需要循环12次,而传统排序还是45次。

目录
相关文章
|
2月前
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
108 0
|
6月前
|
存储 算法 C语言
【数据结构与算法 刷题系列】合并两个有序链表
【数据结构与算法 刷题系列】合并两个有序链表
|
4月前
|
算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
|
6月前
|
算法 Java
[Java·算法·中等] LeetCode21. 合并两个有序链表
[Java·算法·中等] LeetCode21. 合并两个有序链表
62 2
|
6月前
|
算法 安全 Java
【经典算法】LeetCode 21:合并两个有序链表Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 21:合并两个有序链表Java/C/Python3实现含注释说明,Easy)
41 1
|
6月前
|
算法 C语言
数据结构和算法——归并排序(有序子列的归并、递归算法、非递归算法、思路图解、C语言代码)
数据结构和算法——归并排序(有序子列的归并、递归算法、非递归算法、思路图解、C语言代码)
35 0
|
7月前
|
算法 测试技术 Serverless
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
|
7月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于有序抖动块截断编码的水印嵌入和提取算法matlab仿真
这是一个关于数字图像水印嵌入的算法介绍。使用MATLAB2022a,该算法基于DOTC,结合抖动和量化误差隐藏,确保水印的鲁棒性和隐蔽性。图像被分为N*N块,根据水印信号进行二值化处理,通过调整重建电平的奇偶性嵌入水印。水印提取是嵌入过程的逆操作,通过重建电平恢复隐藏的水印比特。提供的代码片段展示了从块处理、水印嵌入到噪声攻击模拟及水印提取的过程,还包括PSNR和NC的计算,用于评估水印在不同噪声水平下的性能。
|
7月前
|
算法 程序员
【算法训练-链表 四】【链表删除】:删除链表的倒数第N个节点、删除有序链表中的重复元素、删除有序链表中的重复元素II
【算法训练-链表 四】【链表删除】:删除链表的倒数第N个节点、删除有序链表中的重复元素、删除有序链表中的重复元素II
64 0
|
7月前
|
算法 程序员
【算法训练-链表 二】【合并链表】合并两个有序链表、合并K个有序链表
【算法训练-链表 二】【合并链表】合并两个有序链表、合并K个有序链表
67 0
下一篇
DataWorks