小程式60s驗證碼倒計時實現
阿新 • • 發佈:2021-02-13
技術標籤:演算法分類題解
位元組面試考到的知識點,對輸入整數資料流取中位數,面試當時想到了單調佇列的方法,維護一個單調佇列總的時間複雜度為,現場沒撕出來,後來去leetcode提交最後一個測試案例超時
不過想法應該是對的,後來看答案是用堆的調整,複習下堆排序,
1.堆排序c++實現
1.1 準備
排序需要藉助一個交換函式swap可以自己實現也可以用c++的實現
#include<bits/stdc++.h> using namespace std; void swap(int arr[], int a, int b){ int tmp = arr[a]; arr[a] = arr[b]; arr[b] = tmp; return ; }
1.2 堆的區域性調整heapify
排序陣列的長度為n,heapify將子結點較大的數移動到i的位置,最好的情況如果i為最大則則不需調整,最壞的情況一直調整到葉子結點調整的次數為樹的高度,即
//時間複雜度為 O(logn) void heapify(int arr[], int n, int i){ int c1 = 2 * i + 1; // 左結點 int c2 = 2 * i + 2; // 右結點 int max = i; if(c1 < n && arr[c1] > arr[max]){ max = c1; } if(c2 < n && arr[c2] > arr[max]){ max = c2; } if(max != i){ swap(arr, i, max); heapify(arr, n, max); } }
1.3 建堆
//時間複雜度為 O(logn)
void buildheap(int arr[], int n){
int l = (n - 1)/2; // 最後一個需要調整的結點位置
for(int i = l; i>=0 ;i--){
heapify(arr, n, i);
}
}
1.4 堆排序
將堆的第一個數和最後一個數交換,調整堆的長度減小1,
//時間複雜度為 O(nlogn) void heapsort(int arr[], int n){ for(int i=n;i>0;i--){ swap(arr, 0, i-1); buildheap(arr, i-1); } }
1.5 測試
int main(){
int arr[7] = {1,31,1,0,0,5,4};
cout<<"開始建堆"<<endl;
buildheap(arr, 7);
for(int i=0;i<7;i++){
cout<<arr[i]<<endl;
}
cout<<"開始排序"<<endl;
heapsort(arr, 7);
for(int i=0;i<7;i++){
cout<<arr[i]<<endl;
}
return 0;
}