【问题标题】:insertion sort on a singly linked list单链表上的插入排序
【发布时间】:2011-03-28 18:04:36
【问题描述】:

我是否认为不可能对单链表执行插入排序?

我的推理:假设 insertion sort 根据定义意味着,当我们在外循环中向右移动时,我们在内循环中向左移动并根据需要向上(向右)移动值并插入我们的使用内部循环完成时的当前值。因此,SLL 无法适应这样的算法。对吗?

【问题讨论】:

  • 这里 SLL 表示单链表,ok...
  • 我是否正确地说“插入排序”是指插入一个元素?
  • 插入排序是一种将列表中的值顺序插入到列表头部的算法,您假设所有元素都按某种顺序排序(主要是递增)。
  • @Maxpm,您将插入与插入排序混淆了:en.wikipedia.org/wiki/Insertion_sort

标签: insertion singly-linked-list


【解决方案1】:

好吧,我听起来像是显而易见的船长,但答案主要取决于您是否可以保持所有迭代的方向与元素链接的方式相同,并且仍然按照您的定义实施正确的排序算法。我真的不想弄乱您对插入排序的定义,所以恐怕您真的必须自己考虑。至少有一段时间。无论如何,这是一个家庭作业...... ;)

好的,这是我在关闭页面之前得到的。您可以反向迭代 SLL,但这需要 n*n/2 次遍历才能访问所有 n 个元素。所以理论上你对排序循环的任何遍历方向都没有问题。猜猜它几乎解决了你的问题。

【讨论】:

  • 无法按照建议反向迭代,因为 SLL 中没有前置链接
  • @both,只是为了澄清一下:我将其标记为家庭作业,因为这几乎可以说我是在学习的背景下这样做的。我的问题本身不是一项任务,它只是一个旨在探索什么可以做,什么不能做的问题。似乎 SLL 不适合插入排序,我正在寻找关于该声明的想法。 (几乎)一切皆有可能,所以我确信有办法,但值得付出努力吗?
  • 可以反向迭代,你只需要一个计数器和一个额外的循环来做到这一点。最初,您找到尾部元素,从头部迭代,并计数以计算其索引,然后从头部迭代到第 (index - 1) 个元素,然后迭代到第 (index-2) 个元素,依此类推。
【解决方案2】:

这是可行的,是一个值得探索的有趣问题。

插入排序算法的核心是用第一个元素创建一个排序序列,并通过添加新元素来扩展它,并保持序列仍然是排序的,直到它包含所有输入数据。

单链表是不能回溯的,但是你可以从头开始寻找新元素的位置。

棘手的部分是在节点j之前插入节点i时,你必须处理好它们的邻居关系(我的意思是节点i和j的邻居都需要照顾)。

【讨论】:

    【解决方案3】:

    这是我的代码。我希望它对你有用。

    int insertSort(Node **pHead)
    {
    Node *current1 = (*pHead)->next;
    Node *pre1 =*pHead;
    Node *current2= *pHead;
    Node *pre2=*pHead;
    while(NULL!=current1)
        {
        pre2=*pHead;
        current2=*pHead;
    
        while((current2->data < current1->data))
        {
            pre2 = current2;
            current2 = current2->next;
        }
        if(current2 != current1)
        {
            pre1->next=current1->next;
            if(current2==*pHead)
            {
                current1->next=*pHead;
                *pHead = current1;
            }
            else
            {
                pre2->next = current1;
                current1->next = current2;
            }
            current1 = pre1->next;
        }
        else
        {
            pre1 = pre1->next;
            current1 = current1->next;
        }
    }
    return 0;
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 2020-06-13
      • 2018-07-18
      • 1970-01-01
      • 2020-12-11
      • 2011-04-23
      相关资源
      最近更新 更多