相对有序排序算法

使用场景:
当需要对一批数据进行逐个筛选,并将筛选后的数据存入一个容器中,当取出来进行第二次操作时,需要取出的数据是按一定的规则排序的时候。
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次。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值