zoukankan      html  css  js  c++  java
  • 经典排序算法的应用

    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;
        }

     2.判断数组中是否有重复元素,要求空间复杂度O(1).

      1.如果没有空间复杂度限制,可以用哈希表实现,时间复杂度O(N)

      2.可以先排序,后判断是否相同的值挨在一起。

      3.空间复杂度O(1)的算法中,考虑堆排序,且不能使用非递归。

    3.对于有序数组A1,A2 ,A1可容纳A1和A2的所有元素,合并A1,A2到数组A1。

      1.确定最后位置last,last1,last2.

      2.每次比较A1,A2的最后两个元素,大的放入A1的尾部

      3.重复,直到A2为空。得到数组A1就是有序数组。

  • 相关阅读:
    MongoDB数据创建与使用
    python库安装方法及下载依赖库
    java开发基础知识学习
    wifi破解基础及工具的使用
    Markdonw基本语法学习
    toj 4353 Estimation(树状数组+二分查找)
    POJ 1694 An Old Stone Game【递归+排序】
    POJ 2092 Grandpa is Famous【水---找出现第二多的数】
    POJ 2993 Emag eht htiw Em Pleh【模拟画棋盘】
    POJ 1068 Parencodings【水模拟--数括号】
  • 原文地址:https://www.cnblogs.com/lshao/p/8996471.html
Copyright © 2011-2022 走看看