我正在尝试对单个链表应用快速排序。我创建了分区功能,它通过将第一个元素视为枢轴来工作:
list->19->8-17->15->25->41
After calling partition(&list) we get :
list->16->17->8->19->25->41
这就是我想要做的事情:
1.)我在列表上打电话给Quicksort()> 19-> 8-17-> 15-> 25-> 41
2.)在QuickSort中,我们将分区列在列表上,因此我得到列表 - > 16-> 17-> 8-> 19-> 25-> 41并且这里' q'指向枢轴元素。
3.)现在使用q我们将列表分成两部分:list1-> 16-> 17-> 8-> Null和list2-> 25-> 41然后在list1上调用quicksort和清单2
4.)然后我将这两个列表加入' q'。
但我的程序在Windows中崩溃可能是由于分段错误。有人可以帮帮我。
#include <stdio.h>
#include <stdlib.h>
struct node{
int data;
struct node * next;
};
typedef struct node Node;
void display(Node *p){
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
Node * create(int d){
Node *p=(Node *)malloc(sizeof(Node));
p->data=d;
p->next=NULL;
return p ;
}
Node * partition(Node **head){
Node *list=*head;
Node *pv=*head;
int pivot=list->data;
Node *p=list->next;
Node *temp,*q=list;
while(1){
if(!p)
break;
if(p->data<pivot){
temp=p;
q->next=temp->next;
p=p->next;
temp->next=list;
list=temp;
}
else{
q=p;
p=p->next;
}
}
*head=list;
return pv ;
}
Node * quicksort(Node * list){
if(list==NULL || (list)->next==NULL)
return list;
Node * q,*list1,*list2,* temp;
q=partition(&list);
list1=list;
list2=q->next;
temp=list1;
while(1){
if(temp->next==q)
{
temp->next=NULL;
break;
}
temp=temp->next;
}
list1=quicksort(list1);
list2=quicksort(list2);
temp=list1;
while(temp->next!=NULL)
temp=temp->next;
temp->next=q;
q->next=list2;
return list1;
}
int main(){
Node *list1=create(19),*list2;
Node *a=create(8);
Node *b=create(17);
Node *c=create(16);
Node *d=create(25);
Node *e=create(41);
list1->next=a;a->next=b;b->next=c;c->next=d;d->next=e;
list1=quicksort(list1);
display(list1);
}
答案 0 :(得分:1)
此时while(1)循环:
AppDelegate
temp可以等于q(当pivot小于列表的其余部分时),因此temp-&gt; next将永远不会等于q,并且当temp-&gt; next == NULL时会发生分段错误,然后做temp = temp-&gt;接下来两次。
自下而上合并排序会更好,但我认为这只是一次学习练习。
update - 一个快速自下而上链接列表合并排序,它使用一个指向节点的指针数组,其中array [i]指向一个大小为2的列表到power i节点(或者它是NULL)。节点一次合并到数组中,然后当所有节点合并到数组中时,数组将合并以生成单个排序列表。
if(temp->next==q)