排序算法可描述如下:這種排序算法的複雜性是什麼?使用相同的缺點是什麼?
1.從陣列數據創建二進制搜索樹。
(對於多次出現,遞增當前節點的occurence變量)
2.導線BST在序方式。
(按順序遍歷將返回數組中元素的排序順序)。
3.在按順序遍歷的每個節點上,用當前節點值覆蓋當前索引(索引從0開始)處的數組元素。
下面是相同的Java實現:
節點類的結構
class Node {
Node left;
int data;
int occurence;
Node right;
}
序功能 (返回類型爲int只是在每次調用獲取正確的指標,他們服務沒有其他目的)
public int inorder(Node root,int[] arr,int index) {
if(root == null) return index;
index = inorder(root.left,arr,index);
for(int i = 0; i < root.getOccurence(); i++)
arr[index++] = root.getData();
index = inorder(root.right,arr,index);
return index;
}
的main()
public static void main(String[] args) {
int[] arr = new int[]{100,100,1,1,1,7,98,47,13,56};
BinarySearchTree bst = new BinarySearchTree(new Node(arr[0]));
for(int i = 1; i < arr.length; i++)
bst.insert(bst.getRoot(),arr[i]);
int dummy = bst.inorder(bst.getRoot(),arr,0);
System.out.println(Arrays.toString(arr));
}
的空間複雜度是可怕的,我知道,但除非排序是用於一個非常龐大的數據集它不應該是一個大問題。但是,正如我所看到的,不是時間複雜性O(n)? (從BST插入和檢索是O(log n),並且每個元素被觸摸一次,使其成爲O(n))。如果我錯了,請糾正我,因爲我還沒有很好地學習過Big-O。
如果你的目標是排序爲O陣列(N *日誌(N))的時候,你已經可以使用快速排序或歸併具有更好的空間使用情況,你從陣圖 - >陣列,而不是陣列 - >樹。 –
@DougCoburn實際上,我們的目標是實現一個O(n)算法,用n [1,n^2]範圍內的每個元素對n個元素進行排序。 – saketk21
我很確定沒有O(n)排序算法。在這些限制下。 –