目录
1.首先,检查输入的链表头节点head是否为空或者只有一个节点
3.在每次循环中,首先将当前节点current初始化为链表头节点
[5. 在内部while循环结束后](#5. 在内部while循环结束后)
一、涉及到的知识点
1.冒泡排序
冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历待排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
以下是冒泡排序算法的实现过程:
- 比较相邻的元素。如果第一个比第二个大(升序),就交换它们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
在实现冒泡排序算法的过程中,通常使用嵌套循环来完成。外层循环负责控制遍历的次数,内层循环负责比较相邻元素并进行交换。在每一轮遍历过程中,最大的元素会逐渐"冒泡"到数列的最后。当所有元素都排序完毕后,算法结束。
2.什么时候需要对链表数据排序
- 主观上需要对链表的数据进行排序的时候;
- 必须先对链表数据执行排序操作,才能有效地执行其它方法,比如升序插入操作之前就需要对已有的链表数据进行排序操作。
二、对链表初始数据冒泡排序算法实现
使用了C#实现了一个冒泡排序算法,用于对链表中的节点进行排序。下面结合源码详细介绍一下冒泡排序算法的实现过程:
1.首先,检查输入的链表头节点head是否为空或者只有一个节点
如果是,那么这个链表已经排序完毕,直接返回head。
cs
if (head == null || head.Next == null)
{
return head;
}
2.接下来,进入一个do-while循环
这个循环会一直执行到没有节点需要交换为止。变量swapped用于标记在当前循环中是否发生了节点值的交换。
cs
bool swapped;
do
{
swapped = false;
3.在每次循环中,首先将当前节点current初始化为链表头节点
然后在current不为null且current的下一个节点也不为null的情况下,进入一个while循环。
cs
ListNode? current = head;
while (current != null && current.Next != null)
4.在内部while循环中
如果当前节点current的值大于下一个节点的值,那么就交换这两个节点的值,并将变量swapped设置为true,表示发生了交换。
cs
if (current.Next.Value < current.Value)
{
int temp = current.Value;
current.Value = current.Next.Value;
current.Next.Value = temp;
swapped = true;
}
5. 在内部while循环结束后
将current向后移动一位,以便在下一次循环中比较下一个节点。
cs
current = current.Next;
6.当外部do-while循环结束时
说明链表中的节点已经按照升序排序完毕,返回排序后的链表头节点head。
cs
} while (swapped);
return head;
这段程序通过双重循环实现了冒泡排序算法,外部do-while循环负责控制排序的次数,内部while循环负责比较相邻节点并进行交换。在每一轮遍历过程中,最大的节点会逐渐"冒泡"到链表的最后。当所有节点都排序完毕后,算法结束。
三、完整的实例
cs
// 对链表初始数据进行冒泡排序并输出
namespace _131_6
{
public class ListNode(int value)
{
public int Value { get; set; } = value;
public ListNode? Next { get; set; }
}
class Program
{
public static void PrintList(ListNode? head)
{
ListNode? current = head;
while (current != null)
{
Console.Write(current.Value + " ");
current = current.Next;
}
Console.WriteLine();
}
/// <summary>
/// 对链表数据冒泡排序
/// </summary>
public static ListNode? SortList(ListNode? head)
{
if (head == null || head.Next == null)
{
return head;
}
bool swapped;
do
{
swapped = false;
ListNode? current = head;
while (current != null && current.Next != null)
{
if (current.Next.Value < current.Value)
{
(current.Next.Value, current.Value) = (current.Value, current.Next.Value);
swapped = true;
}
current = current.Next;
}
} while (swapped);
return head;
}
static void Main(string[] args)
{
ArgumentNullException.ThrowIfNull(args);
ListNode? head = new(5)
{
Next = new ListNode(2)
};
head.Next.Next = new ListNode(8)
{
Next = new ListNode(1)
};
PrintList(head);
Console.WriteLine("********");
// 对初始链表进行排序
head = SortList(head);
PrintList(head);
}
}
}
//运行结果:
/*
5 2 8 1
********
1 2 5 8
*/