链表的插入排序 Linked List Insertion Sort

一、插入排序 Insertion sort

链表的插入排序 Linked List Insertion Sort_第1张图片

 插入排序很像玩扑克牌中整理手牌的过程,从第二个数开始依次比较其与前面所用数据的大小,直到找到其需要在的位置。当从第二个数据遍历到最后一个数据之后就完成了整个数组的排序。

void InsertionSort(int arr[], int n)
{
    for(int i = 0; i= 0; j--)
        {
            //将比temp大的数依次向后移动一位
            arr[j+1] = arr[j];
        }
        //将temp插入到其正确的位置中
        arr[j+1] = temp;
    }
}

二、链表的插入排序

对于单向链表只能从前向后遍历,故从头节点遍历寻找未排好序的节点,如果是数组的话便只需向前遍历找到其正确的位置便可,但由于单向链表无法向前遍历只能重新从头遍历直到找到其正确位置。

同时为防止下次排序时需要从头遍历寻找未排好序的节点,可用precurrent指针储存已排好序的最后一节点,用temp指针储存需要移动的节点。

并且未防止节点需要插入头节点之前而产生边界问题进行讨论,则可以创建一个新的节点作为一个虚假的头节点并用prehead指向此节点。这样便将插入头节点之前变成了在两节点之间插入节点。

第一遍代码:但有错误,需要更改。

Node* InsertionSort(Node *head)
{
    //如果链表长度为0或1,不需要排序。
    if(head == NULL || head->nextptr == NULL )
    {
        return head;
    }
    //创建一个移动的指针遍历链表
    Node *current = head ;
    //创建一个虚假的头节点,将问题归一化处理
    Node *fakehead = new Node ;
    fakehead->Number = "0";
    fakehead->nextptr = head ;
    //创建一个节点来储存current前一节点
    Node *precurrent = fakehead ;
    //创建一个临时指针指向未排好序的节点
    Node *temp = NULL ;
    //从头节点遍历链表寻找到第一个未排好序的节点
    while (current->nextptr != NULL)
    {
        //时刻保持precurrent指向current指向的前一个节点
        if(precurrent->Number <= current->Number)
        {
            precurrent = current ;
            current = current

你可能感兴趣的:(链表,list,数据结构)