Làm phiền anh chị chỉ giúp em thuật toán sắp xêp inssertionsort và qicksort cho linkedlist.thanks
Hỏi về thuật toán sắp xếp trên linked list
Insert sort thì làm như trên wiki. Quicksort thì phải dùng 2 list phụ:
function quicksort(list a)
if size(a)<2: return
list lower,upper;
pivot =head(a);
for each elem in a do
if elem<pivot: append(lower,elem)
if elem>=pivot: append(upper,elem)
end
quicksort(lower)
quicksort(upper)
concat(lower,upper)
end
Ai có thể chỉ kĩ hơn cho e được k.vì e mới học nên còn lơ mơ lắm
Code quick sort voi linkedlist
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct node node;
struct node{
int value;
node * next;
};
typedef struct list list;
struct list{
node * head, *last;
};
list * make_list(){
list * L=(list *)malloc(sizeof(list));
L->head=L->last=NULL;
return L;
}
node * make_node(int value){
node * n=(node *)malloc(sizeof (node));
assert(n);
n->value=value;
n->next=NULL;
return n;
}
node * append(list * L, int value){ // them vao cuoi danh sach, tra ve node dc tao thanh
node * newNode=make_node(value);
if(L->head==NULL){
L->head=L->last=newNode;
}else{
L->last->next=newNode;
L->last=newNode;
}
return newNode;
}
void * free_list(list * L){
node *p=L->head;
while(p){
node * t=p->next;
free(p);
p=t;
}
L->head=L->last=NULL;
}
void print_list(list *L){
node *p=L->head;
while(p){
printf("%d -> ",p->value);
p=p->next;
}
printf("\n");
}
void quick_sort(list *L){
if(!L->head || !L->head->next){
return;
}
list * lower=make_list();
list * upper=make_list();
int pivot=L->head->value;
node *p;
for(p=L->head->next; p!=NULL; p=p->next){
if(p->value>=pivot){
append(upper,p->value);
}else{
append(lower,p->value);
}
}
quick_sort(lower);
append(lower,pivot);
quick_sort(upper);
lower->last->next=upper->head;
lower->last=upper->last;
free_list(L);
L->head=lower->head;
L->last=lower->last;
}
int main() {
list *L=make_list();
append(L, 1);
append(L,3);
append(L,2);
append(L,5);
append(L,4);
puts("# before quick sort:");
print_list(L);
quick_sort(L);
puts("# after quick sort: ");
print_list(L);
return 0;
}
###ouput
# before quick sort:
1 -> 3 -> 2 -> 5 -> 4 ->
# after quick sort:
1 -> 2 -> 3 -> 4 -> 5 ->
quick sort 10^5 phan tu [0,10000)
int main() {
list *L=make_list();
int n=100000;
int i;
srand(time(NULL));
for(i=0;i<n;i++){
append(L,random()%10000);
}
quick_sort(L);
return 0;
}
time ~ 0.19s
2 Likes
Cảm ơn bạn mình đã hiểu.
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?