一個時間複雜度O(n),空間複雜度為O(1)的排序演算法
阿新 • • 發佈:2019-01-06
其實就是利用Hash的思想,開闢一個固定長度的hash陣列用於標記待排序陣列的資料元素是否出現過。由於固定長度的hash陣列,所以空間複雜度與待排序陣列資料規模n沒有關係,也就是說空間複雜度為O(1)。
#include <iostream> using namespace std; //排序能力,[0,65535]區間的數字,你也可以試試更大的 const int MAXN = 65535; bool hash[MAXN]; template<typename T> void Sort(T arr[],int n){ fill(hash,hash+MAXN,false); //時間複雜度為O(n) for(int i=0;i<n;++i){ hash[arr[i]] = true;//標記arr[i]出現過 } //時間複雜度為O(MAXN) int k=0; for(int i=0;i<MAXN;++i){ if(hash[i] == true){ arr[k++] = i; } } 總的時間複雜度為O(n+MAXN),即O(n) } void show(int arr[],int n){ for(int i=0;i<n;++i) cout<<arr[i]<<" "; cout<<endl; } int main(){ int arr [] = {5,6,9,2,3,7,4,1,8}; int n = sizeof(arr)/sizeof(arr[0]); show(arr,n); return 0; }
嘗試測試一個這樣的排序演算法效能
1.待排序元素值不能出現重複,否則會丟失掉重複的資料元素。
2.對於一個幾乎有序的待排序陣列陣列,其時間複雜任然為O(n)。