I want to keep the linked list in sorted order when inserting items (about 200,000 items in the list), which algorithm can you recommend? I made a simple implementation using insertion sort, but its performance is very poor (lots of CPU usage).
Thanks for your help.
I did some comparison between sorting sorting and insertion sorting, but insertion sorting seems to have better performance, I'm a little confused by this result. Can you tell me what is wrong and if there is a better algorithm?
My code (for simplicity, I omitted the node preview in the node structure):
struct node { int number; struct node *next; };
Sort insert:
void insert_node(int value) { struct node *new_node = NULL; struct node *cur_node = NULL; struct node *last_node = NULL; int found; new_node = (struct node *)malloc(sizeof(struct node *)); if(new_node == NULL) { printf("memory problem\n"); } new_node->number = value; if (head == NULL) { new_node->next = NULL; head = new_node; } else if (new_node->number < head->number) { new_node->next = head; head = new_node; } else { cur_node = head; found = 0; while (( cur_node != NULL ) && ( found == 0 )) { if( new_node->number < cur_node->number ) { found = 1; } else { last_node = cur_node; cur_node = cur_node->next; } } if( found == 1 ) { new_node->next = cur_node; } else { last_node->next = new_node; new_node->next = NULL; } }
Combine Sort:
struct node *addnode(int number, struct node *next) { struct node *tnode; tnode = (struct node*)malloc(sizeof(*tnode)); if(tnode != NULL) { tnode->number = number; tnode->next = next; } return tnode; } struct node *merge_sort(struct node *head) { struct node *head_one; struct node *head_two; if((head == NULL) || (head->next == NULL)) return head; head_one = head; head_two = head->next; while((head_two != NULL) && (head_two->next != NULL)) { head = head->next; head_two = head->next->next; } head_two = head->next; head->next = NULL; return merge(merge_sort(head_one), merge_sort(head_two)); } struct node *merge(struct node *head_one, struct node *head_two) { struct node *head_three; if(head_one == NULL) return head_two; if(head_two == NULL) return head_one; if(head_one->number < head_two->number) { head_three = head_one; head_three->next = merge(head_one->next, head_two); } else { head_three = head_two; head_three->next = merge(head_one, head_two->next); } return head_three; }
source share