单链表的一些排序法

单链表排序:
前提:
typedef struct node
{
    in data;
    struct node * next;
}linklist;
插入排序:
void sortlist(linklist * head)
{
    linklist * newhead, * s, * pre ,* p;
    p=head->next;
    newhead=p->next;
    p->next=NULL;
    while(newhead)
    {
        s=newhead;
        newhead=newhead->next;
        pre=head;
        p=head->next;
        while(p!=NULL && p->data < s->data)
        {
            pre=p;
            p=p->next;
        }
        s->next=p;
        pre->next=s;
    }
}
选择排序:
void selectsort(linklist * head)
{
    linklist * p, * min , *q;
    int t;
    for( p=head->next;p->next!=NULL;p=p->next)
    {
        for(min=p,q=p->next;q!=NULL;q=q->next)
        {
            if(q->data < min->data)
                min=q;
        }
        if(min!=p)
        {
            t=p->data;
            p->data=min->data;
            min->data=t;
        }
    }
}
冒泡排序:
void bubblesort(linklist * head)
{
    linklist * end, * p , * q;//end用来记录排好序的最后一个元素地址,p,q分别为前驱,后继
    int temp;
    p=head->next;
    q=p->next;
    end=NULL;
    while(end!=head->next)
    //如果head所指结点的next成员为end,循环结束
    {
        p=head->next;//p结点从链表头结点开始
        q=p->next;//q指向p所指结点的下一个结点
        while(p->next!=end)
        //当p->next的值为end时,表示到链尾
        {
            if(p->data>q->data)//按照数据域从小到大排序
            {
                temp=p->data;
                p->data=q->data;
                q->data=temp;
            }
            p=q;
            q=q->next;
        }
        end=p;//使end指向每次排序的q所指的结点即尾结点
    }
}




单链表插入排序

//简单单链表排序 : 插入排序
ListNode* ListSort(ListNode* head)
{
    if(head == NULL) return NULL;
    ListNode *curNode = NULL,*preNode=NULL,*nextNode=NULL,*node = NULL;
    curNode = head->next;
    head->next = NULL;
    while(curNode)//当前要插入的节点
    {
        node = curNode->next;//保存下一个节点
        if(curNode->value < head->value)//比头结点还小,则成为新的头结点
        {
            curNode->next = head;
            head = curNode;
        }
        else
        {
            preNode = head, nextNode = head->next;
            while(nextNode && nextNode->value<curNode->value)//找到合适位置
            {
                preNode = nextNode;
                nextNode = nextNode->next;
            }
            curNode->next = preNode->next;
            preNode->next = curNode;
        }
        curNode = node;
    }
    return head;//返回新的头结点
}

简单测试:

    const int N = 10;
    string tmp[N]= {"9","3","7","8","1","5","4","0","2","6"};
    ListNode* root = new ListNode;
    root->value = tmp[0];
    ListNode* cur = root,*loopNode = NULL;
    int i = 1;
    while(i < N)
    {
        InsertAfter(cur,tmp[i]);
        cur = cur->next;
        ++i;
    }
    PrintList(root);
    root = ListSort(root);
    PrintList(root);


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C语言链表选择排序的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct node { int data; struct node *next; } Node; // 创建节点 Node *create_node(int data) { Node *node = (Node *)malloc(sizeof(Node)); node->data = data; node->next = NULL; return node; } // 插入节点 void insert_node(Node **head, Node *node) { if (*head == NULL) { *head = node; } else { Node *temp = *head; while (temp->next != NULL) { temp = temp->next; } temp->next = node; } } // 选择排序 void selection_sort(Node **head) { Node *current = *head; while (current != NULL) { Node *min = current; Node *temp = current->next; while (temp != NULL) { if (temp->data < min->data) { min = temp; } temp = temp->next; } // 交换节点数据 int temp_data = current->data; current->data = min->data; min->data = temp_data; current = current->next; } } // 打印链表 void print_list(Node *head) { while (head != NULL) { printf("%d ", head->data); head = head->next; } printf("\n"); } int main() { Node *head = NULL; insert_node(&head, create_node(5)); insert_node(&head, create_node(2)); insert_node(&head, create_node(8)); insert_node(&head, create_node(3)); insert_node(&head, create_node(9)); printf("排序前的链表:\n"); print_list(head); selection_sort(&head); printf("排序后的链表:\n"); print_list(head); return 0; } ``` 在上面的代码中,我们定义了链表节点结构体 Node,并创建了 create_node() 函数来创建节点,insert_node() 函数来插入节点,print_list() 函数来打印链表。同时,我们实现了 selection_sort() 函数来对链表进行选择排序。在 selection_sort() 函数中,我们使用两个指针 current 和 min 来遍历链表,并找到链表中的最小节点,然后交换节点数据。最后,我们在 main() 函数中进行测试,输出排序前和排序后的链表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值