链表排序--冒泡

/**

    冒泡排序 从小大的

   步骤:

   1 从链表开始位置遍历,

     如果next元素比较小,交换位置 直到结束 位置 一次排序完毕 输出最大的节点

   2 第二次排序 

     仍然从链表开始位置遍历 直到第二大位置

   3 重复 

  难点:

  1  从剩余的链表中查找继续变量  循环退出条件

     误区:

     因为冒泡排序每个元素位置地址 不在顺序 有可能前面地址大约后面地址 不在适合指针比较大小

     因为current和pLastTopN 不能通过比较地址大小方式缺点先后顺序

     方法1 通过计数的方式  一共n个记录 n-i 个数

    方法2:记录倒数第k个位置 如果发现遍历到此处马上退出

  2 

   实现出的错误

 1 pLastTopN=current;//排序后当前第k大的位置, 

    第一次排序还没有完成 因为他排除出现了问题

    current ==pLastTopN 

    单链表冒泡排序 和数组冒泡排序区别 不能从第1个位置开始比较 从第二个位置开始

 2 在此次循环

**/

struct ListNode* sortList4(struct ListNode* head) 

{

    ListNode* after=head; //当前节点的前一个节点

    ListNode* pre=head->next; //当前节点

    ListNode* current=pre->next;

    ListNode* pLastTopN=NULL;

    ListNode* pLayOut=head->next;

    for(;pLayOut!=NULL;pLayOut=pLayOut->next)

    {

          after=head; //当前节点的前一个节点

          pre=head->next; //当前节点

          current=pre->next;

        while(current!=NULL)

        {   

           if(pLastTopN!=NULL && current ==pLastTopN)

           {

              break;//遍历完毕  exit

           }

           //满足条件

           if(pre->val <= current->val)

           {   

               //指针移动 

               after=pre;

               pre=current;

               pLastTopN=current;

               current=current->next;

               showAll(head);

               continue;

           }

           //不满足条件

           //swap

           pre->next=current->next;

           current->next=pre;

           after->next=current;

          //重新排序后指针移动

           after=current;

           current=pre->next;

           pLastTopN=pre;//重新排序当前第k大的位置 {6,10}

            showAll(head);

        }

         cout<<"--------------------"<<endl;

          showAll(head);

    }

}
链表排序--冒泡_第1张图片

链表排序--冒泡_第2张图片

链表排序--冒泡_第3张图片

6   1   10   15   20   8

链表排序--冒泡_第4张图片

clipboard[4]

最后一个没有排序

demo 没有演示清楚

1 初始化

2 swap之后

3 移动之后

变量是如何变化的

clipboard[5]

jump 行号

jump 位置

行号可以是:1.数字;2.(+/-)偏移;3.文件名:行号;

位置可以是:1.函数名;2.文件名:函数名;3.*内存地址;

链表排序--冒泡_第5张图片

$5 = {

  val = 6,

  next = 0x603030

}

(gdb) p *after->next

$4 = {

  val = 10,

  next = 0x603070

}

(gdb) p *pre

$1 = {

  val = 10,

  next = 0x603070

}

(gdb) p *pre->next

$2 = {

  val = 1,

  next = 0x603090

}

clipboard[7]

你可能感兴趣的:(链表排序--冒泡)