C 使用BST对结构数组进行排序的函数的时间复杂度是多少?
我有一个使用BST对数组进行排序的函数。首先,我使用for循环和函数insert创建树(在树中插入数据保持有序) 然后我按顺序访问树,并以排序模式将每个节点复制到新的临时存档中。 这是我的密码:C 使用BST对结构数组进行排序的函数的时间复杂度是多少?,c,algorithm,sorting,time-complexity,binary-search-tree,C,Algorithm,Sorting,Time Complexity,Binary Search Tree,我有一个使用BST对数组进行排序的函数。首先,我使用for循环和函数insert创建树(在树中插入数据保持有序) 然后我按顺序访问树,并以排序模式将每个节点复制到新的临时存档中。 这是我的密码: double btree_sort(SPerson Archive[], unsigned int ne, double *btree_creating_time) { int i = 0; TBinaryTree BinaryTree = NULL; cont = 0; LARGE_INTE
double btree_sort(SPerson Archive[], unsigned int ne, double *btree_creating_time)
{
int i = 0;
TBinaryTree BinaryTree = NULL;
cont = 0;
LARGE_INTEGER freq;
LARGE_INTEGER t0, tF, tDiff;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&t0);
/*Algorithm*/
for (i = 0; i < ne; i++) /*Creating B-Tree*/
BinaryTree = binarytree_insert(BinaryTree, Archive[i]);
QueryPerformanceCounter(&tF);
tDiff.QuadPart = tF.QuadPart - t0.QuadPart;
*btree_creating_time = tDiff.QuadPart / (double)freq.QuadPart;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&t0);
inorder(BinaryTree, Archive);
/*end*/
QueryPerformanceCounter(&tF);
tDiff.QuadPart = tF.QuadPart - t0.QuadPart;
free(BinaryTree);
return tDiff.QuadPart / (double)freq.QuadPart;
}
int inorder(TBinaryTree BinaryTree, SPerson Archive[])
{
if (BinaryTree)
{
inorder(BinaryTree->left,Archive);
swap(&Archive[cont++], &BinaryTree->information);
inorder(BinaryTree->right, Archive);
}
return 1;
}
TBinaryTree binarytree_insert(TBinaryTree bt, SPerson to_add)
{
if (bt == NULL)
{
TNode *new_node = create_node(to_add);
if (new_node == NULL)
{
MessageBoxA(0, "Error allocating memory.", "", 0);
exit(1);
}
return new_node;
}
else
{
if (strcmp(to_add.id, bt->information.id)<0)
{
bt->left = binarytree_insert(bt->left, to_add);
return bt;
}
else
{
bt->right = binarytree_insert(bt->right, to_add);
return bt;
}
}
}
double-btree\u排序(SPerson归档[],无符号整数,double*btree\u创建时间)
{
int i=0;
TBinaryTree BinaryTree=NULL;
cont=0;
大整数频率;
大整数t0,tF,tDiff;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&t0);
/*算法*/
对于(i=0;i左,存档);
交换(&Archive[cont++],&BinaryTree->information);
顺序(二进制树->右侧,存档);
}
返回1;
}
TBinaryTree二进制树插入(TBinaryTree bt,SPerson to_add)
{
if(bt==NULL)
{
TNode*new_node=创建_node(要添加);
if(新节点==NULL)
{
MessageBoxA(0,“分配内存时出错。”,“”,0);
出口(1);
}
返回新的_节点;
}
其他的
{
if(strcmp(to_add.id,bt->information.id)left=binarytree_insert(bt->left,to_add);
返回bt;
}
其他的
{
bt->right=binarytree\u insert(bt->right,to\u add);
返回bt;
}
}
}
认为:
我说得对吗?有什么建议吗?提前谢谢。最坏情况下的复杂性称为O-Big Oh表示法。我们通常只使用最坏情况下的复杂性。同时,在一个Btree中插入所有节点是O(nlogn)。因此,对树进行排序就是插入所有键,然后按复杂度为O(n)的顺序遍历树
因此,总体复杂度是O(nlogn)+O(n),也就是O(nlogn)最坏情况的复杂度被称为O-Big-Oh表示法。我们通常只使用最坏情况的复杂度。同时,在一个Btree中插入所有节点是O(nlogn)。因此,对树进行排序就是插入所有键,然后按复杂度为O(n)的顺序遍历树
因此,总体复杂度是O(nlogn)+O(n),即O(nlogn)二叉搜索树上的插入操作的最坏情况时间复杂度为O(logn)。插入n个数字将是O(nlogn)。然后依次遍历所有n个节点,即O(n)。因此,O(nlogn)+O(n)即O(nlogn).二叉搜索树上的插入操作的最坏情况时间复杂度为O(logn)。插入n个数字将是O(nlogn)。然后依次遍历所有n个节点,即O(nlogn)。因此O(nlogn)+O(n)即O(nlogn)。我不清楚您所说的“…O到最佳情况…”是什么意思,你是指大O吗?是的,在我的书中我发现了O,比如上限松弛和Ω小于极限松弛。好吧,那么“O”不是最好的情况;作为上限它是最坏的。我不清楚你所说的“…O到最佳情况…”是指大O吗?是的,在我的书中我发现了O,比如上限松弛和Ω小于极限松弛。好的,然后是“O”不是最好的情况;它是最坏的上界。我必须用Θ符号表示。所以它将是:Θ(nlogn)?我必须用Θ符号表示。所以它将是:Θ(nlogn)?我必须用Θ符号表示。所以它将是:Θ(nlogn)?如果你必须用“θ”符号表示(紧界),那么它将是“θ(n)”最好的情况是“theta(nlogn)”,最坏的情况是“theta(nlogn)”。为了概括,我们使用上界“big oh”。我必须用Θ表示法表示。所以它将是:Θ(nlogn)?如果你必须用“theta”表示法(紧界),那么最好的情况是“theta(n)”,最坏的情况是“theta(nlogn)”。为了概括,我们使用上界“big oh”.