码迷,mamicode.com
首页 > 编程语言 > 详细

经典排序算法的应用

时间:2018-05-06 14:47:29      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:算法   堆排序   bsp   bre   无法   pre   sort   return   插入排序   

1.对几乎有序的数组排序

  问题:给定数组arr,元素个数为N,将其排序后元素移动的顺序不超过K,其中K<<N。

  分析:

     1.冒泡排序,选择排序,快速排序,归并排序等排序时间复杂度与数组状态无关。

     2.插入排序复杂度为O(N*K)

     3.改进后的堆排序可以做到O(N*logK)

  改进后的堆排序:

  1.考虑到每次移动不超过K,则最小的元素在0..K中。

  2.将0...K进行建小堆,得到最小元素arr[0]。

  3.弹出堆顶,将下一个元素不在堆内的元素置入堆顶,下滤。

  4.重复3,直到无法添加新元素时,堆的最后一个元素置入堆顶,删除堆的最后一个元素,下滤,弹出堆顶。

  5.堆为空,数组排序完成。

 vector<int> percDown(vector<int> A,int p,int r){
        int parent,child;
        int key=A[p];
        for(parent=p;parent*2+1<=r;parent=child){
            child=parent*2+1;
            if(child+1<=r&&A[child]>A[child+1])
                child++;
            if(key<=A[child]) break;
            else{
                A[parent]=A[child];
            }
        }
        A[parent]=key;
        return A;
    }


    vector<int> sortElement(vector<int> A, int n, int k) {
        // write code here
        //建立小堆
        for(int j=(k-1)/2;j>=0;j--)
            A=percDown(A,j,k);

        vector<int> res;
        int heaplast=k;
        for(int i=0;i<n;i++){
            res.push_back(A[0]);
            int last=i+k+1;

            if(last>n-1) {
                A[0]=A[heaplast--];
                A=percDown(A,0,heaplast);
            }else{
                A[0]=A[last];
                A=percDown(A,0,k);
            }
        }
        return res;
    }

 

经典排序算法的应用

标签:算法   堆排序   bsp   bre   无法   pre   sort   return   插入排序   

原文地址:https://www.cnblogs.com/lshao/p/8996471.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!