1. 程式人生 > >經典排序算法的應用

經典排序算法的應用

問題 選擇 一個 狀態 int 元素移動 style 冒泡排序 快速排序

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

經典排序算法的應用