Merge pull request 'add Q33 and finished' (#6) from developed_in_2024_12_18 into main
Reviewed-on: https://external.feng-arch.cn:35127/fengqi/ysyx/pulls/6
This commit is contained in:
commit
2c3f985808
@ -27,7 +27,6 @@ void List_clear_destroy(List *list);
|
||||
|
||||
void List_push(List *list, void *value);
|
||||
void *List_pop(List *list);
|
||||
|
||||
void List_unshift(List *list, void *value);
|
||||
void *List_shift(List *list);
|
||||
|
||||
|
||||
@ -1,10 +1,64 @@
|
||||
#include "list_algos.h"
|
||||
#include "dbg.h"
|
||||
|
||||
void swap_node(ListNode* a,ListNode *b){
|
||||
void *c = a->value;
|
||||
a->value = b->value;
|
||||
b->value = c;
|
||||
}
|
||||
|
||||
|
||||
List* merge_list(List* left, List* right,List_compare cmp){
|
||||
List* result = List_create();
|
||||
while(left->first && right->first){
|
||||
if(cmp(left->first->value,right->first->value) < 0){
|
||||
List_push(result,List_shift(left));
|
||||
} else {
|
||||
List_push(result,List_shift(right));
|
||||
}
|
||||
}
|
||||
while(left->first){
|
||||
List_push(result,List_shift(left));
|
||||
}
|
||||
while(right->first){
|
||||
List_push(result,List_shift(right));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void List_print(List *list){
|
||||
for(ListNode *nodeA = list->first;nodeA != NULL ; nodeA=nodeA->next){
|
||||
printf("%s -> ", (char*)nodeA->value);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
|
||||
int List_bubble_sort(List *list, List_compare cmp)
|
||||
{
|
||||
if(list->count < 2)
|
||||
return 0;
|
||||
|
||||
for(ListNode *nodeA = list->first;nodeA != list->last ; nodeA=nodeA->next){
|
||||
for(ListNode *nodeB = nodeA->next;nodeB != NULL;nodeB=nodeB->next){
|
||||
if(cmp(nodeB->value,nodeA->value) < 1){
|
||||
swap_node(nodeA,nodeB);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
List *List_merge_sort(List *list, List_compare cmp)
|
||||
{
|
||||
}
|
||||
if(list->count<2) return list;
|
||||
int left = list->count/2;
|
||||
int right = list->count - left;
|
||||
List * left_list = List_create();
|
||||
List * right_list = List_create();
|
||||
for(int i=0;i<right;i++){
|
||||
List_push(right_list,List_pop(list));
|
||||
}
|
||||
left_list = list;
|
||||
return merge_list(List_merge_sort(left_list,cmp),List_merge_sort(right_list,cmp),cmp);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user