Skip to content
On this page

数据结构_单向链表_链表排序


标签:算法/list  

冒泡排序

冒泡排序的算法可以看这个笔记。其要点在于连个节点位置进行交换,或者简单点,不进行位置交换,而是交换其中的数据域。

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;
}

in source code

冒泡排序每一轮都是从第一个元素开始的,而且前面一轮的范围比后面一轮大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;
}

in source code

和冒泡排序不一样的是,冒泡排序因为每次都是从头位置开始,所以只需要一个游标就行了,而快速排序每次都是将排序好的放在最开头,所以需要两个游标,其中 i 存放的是最前面一个未排序位置的游标,j 则用于当前次循环遍历。

同样的原因,冒泡把排序好的元素放在最后面,所以不能使用 while 判断指针是否为空作为边界,而选择排序可以(当然,你也可以用 for 进行简单排序)。

快速排序

148. 排序链表 - 力扣(Leetcode)

Last updated: