链表插入排序

链表插入排序

算法思维

  1. 将第一个元素看作一个有序序列
  2. 将后面的元素按升降次序插入有序序列,一直重复直到整个序列有序

设计思维

  1. 用带有头节点的列表 list 方便运算
  2. 因为升序和降序只有判断方法不一样,所以可以设置一个mode变量表示排序方式
  3. 创建一个新的链表 list_sorted 存放有序序列,按反序放置,此时有序数列的最后一个元素就是此链表的第一个元素
  4. 取出一个未排序的元素,找到相应的位置并插入,重复4直到所有结点有序
  5. 再按照反序把 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));
    }
}

运算结果

  1. 测试代码
    #define N 11
    
    int 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;
    }
    
  2. 运算结果
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值