1. 程式人生 > >一個時間複雜度O(n),空間複雜度為O(1)的排序演算法

一個時間複雜度O(n),空間複雜度為O(1)的排序演算法

其實就是利用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)。