单链接列表中的Quick_Sort

时间:2015-08-01 09:37:49

标签: c algorithm sorting

我正在尝试对单个链表应用快速排序。我创建了分区功能,它通过将第一个元素视为枢轴来工作:

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);


}

1 个答案:

答案 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)