C 使用插入排序查找第k个最小元素
我试图编写代码,使用插入排序查找第k个最小的元素,但代码中出现运行时错误。 在第一行,我们得到了查询数(比如n)和k(要查找的第k个最小数)。然后给我们n个数字,如果我们遇到-1,我们需要打印到目前为止遇到的第k个最小数字(除了前面的-1) 我试着在根据问题稍加修改后使用 (我没有发布代码,因为它足够长,任何人都可以通读&这个问题不是家庭作业) 有人能告诉我需要编辑吗 好的,我发布我的代码:-C 使用插入排序查找第k个最小元素,c,insertion-sort,C,Insertion Sort,我试图编写代码,使用插入排序查找第k个最小的元素,但代码中出现运行时错误。 在第一行,我们得到了查询数(比如n)和k(要查找的第k个最小数)。然后给我们n个数字,如果我们遇到-1,我们需要打印到目前为止遇到的第k个最小数字(除了前面的-1) 我试着在根据问题稍加修改后使用 (我没有发布代码,因为它足够长,任何人都可以通读&这个问题不是家庭作业) 有人能告诉我需要编辑吗 好的,我发布我的代码:- #include <stdio.h> #include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#define ARRAY_SIZE(arr) sizeof(arr)/sizeof(arr[0])
/* just add elements to test */
/* NOTE: A sorted array results in skewed tree */
int ele[] = { 20, 8, 22, 4, 12, 10, 14 };
/* same alias */
typedef struct node_t node_t;
/* Binary tree node */
struct node_t
{
int data;
node_t* left;
node_t* right;
};
/* simple stack that stores node addresses */
typedef struct stack_t stack_t;
/* initial element always NULL, uses as sentinal */
struct stack_t
{
node_t* base[ARRAY_SIZE(ele) + 1];
int stackIndex;
};
/* pop operation of stack */
node_t *pop(stack_t *st)
{
node_t *ret = NULL;
if( st && st->stackIndex > 0 )
{
ret = st->base[st->stackIndex];
st->stackIndex--;
}
return ret;
}
/* push operation of stack */
void push(stack_t *st, node_t *node)
{
if( st )
{
st->stackIndex++;
st->base[st->stackIndex] = node;
}
}
/* Iterative insertion
Recursion is least preferred unless we gain something
*/
node_t *insert_node(node_t *root, node_t* node)
{
/* A crawling pointer */
node_t *pTraverse = root;
node_t *currentParent = root;
// Traverse till appropriate node
while(pTraverse)
{
currentParent = pTraverse;
if( node->data < pTraverse->data )
{
/* left subtree */
pTraverse = pTraverse->left;
}
else
{
/* right subtree */
pTraverse = pTraverse->right;
}
}
/* If the tree is empty, make it as root node */
if( !root )
{
root = node;
}
else if( node->data < currentParent->data )
{
/* Insert on left side */
currentParent->left = node;
}
else
{
/* Insert on right side */
currentParent->right = node;
}
return root;
}
/* Elements are in an array. The function builds binary tree */
node_t* binary_search_tree(node_t *root, int keys[], int const size)
{
int iterator;
node_t *new_node = NULL;
for(iterator = 0; iterator < size; iterator++)
{
new_node = (node_t *)malloc( sizeof(node_t) );
/* initialize */
new_node->data = keys[iterator];
new_node->left = NULL;
new_node->right = NULL;
/* insert into BST */
root = insert_node(root, new_node);
}
return root;
}
node_t *k_smallest_element_inorder(stack_t *stack, node_t *root, int k)
{
stack_t *st = stack;
node_t *pCrawl = root;
/* move to left extremen (minimum) */
while( pCrawl )
{
push(st, pCrawl);
pCrawl = pCrawl->left;
}
/* pop off stack and process each node */
while( pCrawl = pop(st) )
{
/* each pop operation emits one element
in the order
*/
if( !--k )
{
/* loop testing */
st->stackIndex = 0;
break;
}
/* there is right subtree */
if( pCrawl->right )
{
/* push the left subtree of right subtree */
pCrawl = pCrawl->right;
while( pCrawl )
{
push(st, pCrawl);
pCrawl = pCrawl->left;
}
/* pop off stack and repeat */
}
}
/* node having k-th element or NULL node */
return pCrawl;
}
/* Driver program to test above functions */
int main(void)
{
int n,k,elec=0,tmp;
scanf("%d",&n);
scanf("%d",&k);
while (n--) {
scanf("%d",&tmp);
if (tmp!=-1) {
ele[elec]=tmp;
elec++;
} else {
node_t* root = NULL;
stack_t stack = { {0}, 0 };
node_t *kNode = NULL;
/* Creating the tree given in the above diagram */
root = binary_search_tree(root, ele, ARRAY_SIZE(ele));
kNode = k_smallest_element_inorder(&stack, root, k);
if( kNode )
{
printf("%d\n",kNode->data);
}
}}
return 0;
}
#包括
#包括
#定义数组大小(arr)sizeof(arr)/sizeof(arr[0])
/*只需添加测试元素即可*/
/*注意:排序的数组会导致树倾斜*/
int ele[]={20,8,22,4,12,10,14};
/*同一别名*/
类型定义结构节点;
/*二叉树节点*/
结构节点
{
int数据;
节点_t*左;
节点_t*右;
};
/*存储节点地址的简单堆栈*/
类型定义结构堆栈;
/*初始元素始终为NULL,用作sentinal*/
结构堆栈
{
node_t*base[数组大小(ele)+1];
int-stackIndex;
};
/*堆栈的pop操作*/
节点\u t*pop(堆栈\u t*st)
{
node_t*ret=NULL;
如果(st&&st->stackIndex>0)
{
ret=st->base[st->stackIndex];
st->stackIndex--;
}
返回ret;
}
/*堆栈的推操作*/
无效推送(堆栈、节点)
{
if(st)
{
st->stackIndex++;
st->base[st->stackIndex]=节点;
}
}
/*迭代插入
除非我们得到一些东西,否则递归是最不可取的
*/
节点\u t*插入节点(节点\u t*根,节点\u t*节点)
{
/*爬行指针*/
node_t*pTraverse=root;
节点\u t*currentParent=根;
//遍历到适当的节点
while(pTraverse)
{
currentParent=pTraverse;
如果(节点->数据数据)
{
/*左子树*/
pTraverse=pTraverse->left;
}
其他的
{
/*右子树*/
pTraverse=pTraverse->right;
}
}
/*如果树为空,则将其设为根节点*/
如果(!root)
{
根=节点;
}
else if(节点->数据<当前父节点->数据)
{
/*在左侧插入*/
currentParent->left=节点;
}
其他的
{
/*插入右侧*/
currentParent->right=节点;
}
返回根;
}
/*元素在一个数组中。该函数用于构建二叉树*/
node_t*二进制搜索树(node_t*根,int key[],int const size)
{
整数迭代器;
node_t*new_node=NULL;
for(迭代器=0;迭代器数据=键[迭代器];
新建_节点->左=空;
新建_节点->右=空;
/*插入BST*/
根=插入_节点(根,新_节点);
}
返回根;
}
节点\u t*k\u最小元素\u顺序(堆栈\u t*stack,节点\u t*root,int k)
{
stack_t*st=stack;
node_t*pCrawl=根;
/*移动到左端(最小值)*/
while(pCrawl)
{
推(st,pCrawl);
pCrawl=pCrawl->左;
}
/*弹出堆栈并处理每个节点*/
而(pCrawl=pop(st))
{
/*每个pop操作发射一个元素
按顺序
*/
if(!--k)
{
/*回路测试*/
st->stackIndex=0;
打破
}
/*有右子树*/
如果(绘制->右侧)
{
/*推动右子树的左子树*/
pCrawl=pCrawl->右侧;
while(pCrawl)
{
推(st,pCrawl);
pCrawl=pCrawl->左;
}
/*跳出堆栈并重复*/
}
}
/*具有第k个元素或空节点的节点*/
返回pCrawl;
}
/*用于测试上述功能的驱动程序*/
内部主(空)
{
int n,k,elec=0,tmp;
scanf(“%d”和“&n”);
scanf(“%d”和“&k”);
而(n--){
scanf(“%d”和tmp);
如果(tmp!=-1){
ele[elec]=tmp;
elec++;
}否则{
node_t*root=NULL;
stack_t stack={{0},0};
node_t*kNode=NULL;
/*创建上图中给出的树*/
根=二进制搜索树(根、元素、数组大小(元素));
kNode=k_最小元素_顺序(&stack,root,k);
if(kNode)
{
printf(“%d\n”,旋钮->数据);
}
}}
返回0;
}
所以您不想显示引发运行时错误的代码。。。你认为任何人都能猜出发生了什么???每当你遇到运行时错误或“崩溃”时,你的第一反应应该是在调试器中运行你的程序。它将帮助您定位错误的位置,还可以让您检查变量,以查看可能导致错误的原因。至于不发布代码,请参阅。如果没有其他内容,您不必发布所有代码,只需发布给您带来麻烦的代码,以及理解它所需的任何声明。