This is supposed to be efficient code, but it's taking much longer than what a normal insertion sort would take. I can't identify what's the problem with this insertion sort. Is there an implementation problem?
// function to sort a singly linked list using insertion sort
void insertionSort(element_t **head_ref)
{
// Initialize sorted linked list
element_t *sorted = NULL;
// Traverse the given linked list and insert every
// node to sorted
element_t *current = *head_ref;
while (current != NULL)
{
// Store next for next iteration
element_t *next = current->next;
// insert current in sorted linked list
sortedInsert(&sorted, current);
// Update current
current = next;
}
// Update head_ref to point to sorted linked list
*head_ref = sorted;
}
/* function to insert a new_node in a list. Note that this
function expects a pointer to head_ref as this can modify the
head of the input linked list (similar to push())*/
void sortedInsert(element_t** head_ref, element_t* new_node)
{
element_t* current;
/* Special case for the head end */
if (*head_ref == NULL || (*head_ref)->val >= new_node->val)
{
new_node->next = *head_ref;
*head_ref = new_node;
}
else
{
/* Locate the node before the point of insertion */
current = *head_ref;
while (current->next!=NULL &&
current->next->val < new_node->val)
{
current = current->next;
}
new_node->next = current->next;
current->next = new_node;
}
}