Appearance
冒泡排序
冒泡排序的算法可以看这个笔记。其要点在于连个节点位置进行交换,或者简单点,不进行位置交换,而是交换其中的数据域。
c
int BubbleSortLinkedlist(linkedlist l) {
if(l == NULL || l->len == 0)
return -1;
for(int i = 1; i < l->len; i++) {
linkedlist p = l->next;
int flag = 0;
for(int j = 0; j < l->len - i; j++) {
if(p->data > p->next->data) {
datatype temp = p->data;
p->data = p->next->data;
p->next->data = temp;
flag = 1;
}
p = p->next;
}
if(flag == 0)
break;
}
return 0;
}冒泡排序每一轮都是从第一个元素开始的,而且前面一轮的范围比后面一轮大1,如果说前面一轮里已经没有发生交换了,那么说明链表已经是有序的结构了。
选择排序
选择排序的算法
c
int SelectionSortLinkedlist(linkedlist l) {
if (l == NULL || l->len == 0)
return -1;
linkedlist i = l->next;
while (i != NULL) {
linkedlist min = i;
linkedlist j = i;
while (j != NULL) {
if (j->data < min->data)
min = j;
j = j->next;
}
if (min != i) {
datatype temp = i->data;
i->data = min->data;
min->data = temp;
}
i = i->next;
}
return 0;
}和冒泡排序不一样的是,冒泡排序因为每次都是从头位置开始,所以只需要一个游标就行了,而快速排序每次都是将排序好的放在最开头,所以需要两个游标,其中 i 存放的是最前面一个未排序位置的游标,j 则用于当前次循环遍历。
同样的原因,冒泡把排序好的元素放在最后面,所以不能使用 while 判断指针是否为空作为边界,而选择排序可以(当然,你也可以用 for 进行简单排序)。