384 字
2 分钟
链表插入排序
链表插入排序
算法思维
- 将第一个元素看作一个有序序列
- 将后面的元素按升降次序插入有序序列,一直重复直到整个序列有序
设计思维
- 用带有头节点的列表 list 方便运算
- 因为升序和降序只有判断方法不一样,所以可以设置一个mode变量表示排序方式
- 创建一个新的链表 list_sorted 存放有序序列,按反序放置,此时有序数列的最后一个元素就是此链表的第一个元素
- 取出一个未排序的元素,找到相应的位置并插入,重复4直到所有结点有序
- 再按照反序把 list_sorted 中的元素插入 list中,即可得到最后结果
算法实现
// 判断int sort_judgeWithMode(int num1, int num2, int mode){ return mode? num1<num2:num1>num2;}
// 链表插入排序/*mode: 非0:升序, 0:降序*/void sort_straightInsertionSort_list(SNode* slist, int mode){ SNode *slist_sorted = createSNode(-1); SNode *current, *slist_sorted_tmp, *slist_sorted_tmp_next;
while(slist->next) { // 获得一个未排序的 current = deleteNextSNode(slist); slist_sorted_tmp = slist_sorted; while(1) { // c语言好像不能直接用->next->value,所以设个变量 slist_sorted_tmp_next = slist_sorted_tmp->next; if(slist_sorted_tmp_next == NULL || sort_judgeWithMode(slist_sorted_tmp_next->value, current->value, mode)) { addSNodeToTheNext(slist_sorted_tmp, current); break; } slist_sorted_tmp = slist_sorted_tmp_next; } }
// 将有序链表反序插回 while(slist_sorted->next) { addSNodeToTheNext(slist, deleteNextSNode(slist_sorted)); }}运算结果
- 测试代码
#define N 11int main(){int arr[N] = {-1,1,3,543,234,65,23,4,23,234,87};SNode* slist = createList(arr,N);printSNodes(slist,"%d ", "\n");printf("降序:");sort_straightInsertionSort_list(slist, 0);printSNodes(slist,"%d ", "\n");printf("升序:");sort_straightInsertionSort_list(slist, 1);printSNodes(slist,"%d ", "\n");return 0;}
- 运算结果

原文链接:CSDN