链表的冒泡和插入排序

冒泡:注意代码的两个位置

每一趟(外循环)都从首节点开始找

每一次(内循环)比较后链表后移

void BubbleSortLink(LinkList *L) //交换结点数据域---冒泡排序实现
{
    int len = LenLink(L);//获取链表长度
    LinkList *p = NULL;
    int i, j, temp;
    for (i = 0; i < len - 1; i++)
    {
        p = L->next;//位置1
        for (j = 0; j < len - i - 1; j++)
        {
            if (p->data > p->next->data)
            {
                temp = p->data;
                p->data = p->next->data;
                p->next->data = temp;
            }
            p = p->next;//位置2
        }
    }
}

插入:网上找的一堆while循环写的,没有图示,思路不清晰;这里给出插入排序和链表插入排序  以供比较(easy)

主要思想就是顺序遍历p,记录p,然后从头在L中找p的插入位置,将p插入即可

void InsertSort(int arr[], int length)
{
    int i, j;                    //j为开始查找的位置
    for (i = 1; i < length; i++) //从第2个数据开始插入
    {
        if (arr[i - 1] > arr[i]) //若待插入元素已经有序,则不进入if
        {
            int temp = arr[i];                            //拿出待插入元素(后)
            for (j = i - 1; j >= 0 && temp < arr[j]; j--) //从已排序的最右边开始,把大于当前插入元素的元素后移
            {
                arr[j + 1] = arr[j];
            }
            arr[j + 1] = temp; //将temp插到arr[j+1]的位置(即空的那个位置)
        }
    }
}

//链表插入排序

void InsertSortlink(LinkList *L)
{
    LinkList *x, *y;   //原链表的前后指针
    LinkList *pre, *p; //新链表的前后指针
    //将L先保存到p中,再清空L,L成为新链表
    p = L->next;
    L->next = NULL;
    
    //从第一个元素开始插入 (头节点不用插入,所以也就是意义上的第二个元素)
    for (x = p; x != NULL; x = y)
    {

        LinkList *temp = x; //记录待插入元素
        y = x->next;        //保护插入元素后面的元素,方便后移
        //找待插入位置和其前一个位置  初始pre = L,p=L->next
        //找不到就继续向后找
        for (pre = L, p = L->next; p != NULL && temp->data > p->data; pre = p, p = p->next)
            ;
        //保护后面的元素
        temp->next = p;
        //插入
        pre->next = temp;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值