将带头结点的单向链表结点数据域中的数据从小到大排序即若圆链表节点数据域从头至尾的数据为10 4 2 8 6排序后,列表节点数据与从头至尾的数据为2 4 6 8 10。
供参考:
void sortList(NODE *h)
{
/************Begin**********/
NODE *ptr = NULL, *pt = NULL, *pend = NULL;
while (h->next != pend)
{
ptr = h;
pt = h->next;
while (pt->next != pend)
{
if (pt->data > pt->next->data)
{
ptr->next = pt->next;
pt->next = pt->next->next;
ptr->next->next = pt;
pt = ptr->next;
}
pt = pt->next;
ptr = ptr->next;
}
pend = pt;
}
/************End**********/
}
另一种只交换数据域的写法,供参考:
void sortList(NODE* h)
{
/**********Begin**********/
int t;
NODE* ph = NULL, * pt = NULL;
ph = h->next;
while (ph) {
pt = ph->next;
while (pt) {
if (ph->data > pt->data) {
t = ph->data;
ph->data = pt->data;
pt->data = t;
}
pt = pt->next;
}
ph = ph->next;
}
/***********End***********/
}
这么长的代码应该复制到代码块里放出来,放个截图谁愿意照着打字吗?
首先,简单选择排序是一个稳定的排序算法;它最大的特点就是交换移动数据次数相当少,这样也就节约了相应的时间。分析它的时间复杂度发现,无论最好最差的情况,其比较次数都是一样的多,第i趟排序需要进行n-i次关键字的比较,此时需要比较
而对于交换次数而言,当最好的时候,交换为0次,最差的时候,也就初始化降序,需要交换n-1次,基于最终的排序时间是比较与交换的次数总和,因此,总的时间复杂度依然为O(n²)
我们可以使用冒泡排序算法对带头结点的单向链表进行排序。冒泡排序是一种简单直观的排序算法,其基本思想是通过相邻元素的比较和交换,将较大的元素逐渐“浮”到右侧。
下面是一个示例的代码实现:
void BubbleSort(LinkList L) {
if (L == NULL || L->next == NULL) { // 空链表或只有一个节点,无需排序
return;
}
int len = 0;
LinkList p = L->next;
while (p != NULL) { // 计算链表长度
len++;
p = p->next;
}
for (int i = 0; i < len-1; i++) { // 遍历链表,每次冒泡排序将最大值移到最后
p = L->next;
for (int j = 0; j < len-i-1; j++) {
if (p->data > p->next->data) { // 如果当前节点大于下一个节点,则交换节点数据
int temp = p->data;
p->data = p->next->data;
p->next->data = temp;
}
p = p->next;
}
}
}
具体实现步骤如下:
请注意,上述代码是C语言的示例代码,您可以根据具体的编程语言进行修改和转换。
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633