总结回顾插入排序算法(Leetcode147)

总结leetcode算法题147

插入排序算法:

插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/insertion-sort-list

题目分析:

其实就是给定一个链表,将其按照要求进行排序。比如输入的是4 ->1 ->2 ->3,输出的结果是1 ->2 ->3 ->4。代码如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 * class Solution {
    public ListNode insertionSortList(ListNode head) {
		//判断输入链表是否为空
		if(head==null){
			return head;
		}
		//可以理解为定义一个对象指向链表的第一个元素
		ListCode point = head ;
		//定义一个对象指向链表的下一个元素
		ListCode nNode = point.next;
		while(nNode!=null){
			//顺序正常,无须调换位置
			if(nNode.val >= point.val){//注意这里不可以换成head.val
				point = nNode;
				nNode = point.next;
				//结束当前循环,进行下一次循环
				continue;
			}
			//顺序不正常,需要调换顺序,先将该元素从链表中断开
			point.next = nNode.next;
			//判断断开的元素跟头元素比较,如果比头结点还小,直接让它作为头结点
			if(nNode.val <= head.val){//这里不可以换成point.val
				nNode.next = head;
				head = nNode;
			}else{
				//需要遍历插入的位置
				ListCode xNode = head;
				while(true){
					if(nNode.val <= xNode.next.val ){
						nNode.next = xNode.next;
						xNode.next = nNode;
						break;
					}
					//如果当前元素比xNode.next.val小,那么xNode向后移动一位
					xNode = xNode.next;
				}
			}
			让point指向排好序的nNode的前一个元素
			nNode = point.next;
		}
		return head;
	}
}
 */

可能代码看起来比较麻烦,所以我根据自己的理解,绘制一些图便于理解。
一开始是这样的,我们假设输入的链表是4123,那么首先point指向第一个元素,nNode指向下一个元素

在这里插入图片描述
之后,进行判断nNode比前一个元素,也就是头结点小,所以我们需要将其从链表中断开,并且将point所指的元素指向nNode的下一个元素。如下所示
在这里插入图片描述
接下来判断断开来的元素和头元素谁大谁小,如果比头元素还小,直接让它做头结点,很明显,比头结点4还小,所以直接让其下一位指向头结点,将该元素变成头结点。

nNode.next = head;
head = nNode;
在这里插入图片描述

之后开始下一次循环,nNode!=null成立,所以判断nNode和point谁大谁小,很明显,顺序不需要调整,直接变换位置,如下图
在这里插入图片描述跳出当前循环,继续下次循环,这次2<4,所以需要判断,2和1谁大,很明显,2需要进行寻找合适的插入位置,设xNode=head,则如图所示
在这里插入图片描述
判断xNode.next也就是4和2的大小,所以2需要插入1和4中间,只需要将

nNode.next = xNode.next;
xNode.next = nNode;

在这里插入图片描述
之后的操作如上所示,这里就不再赘述了。以上就是我对于此题解法的理解,如果有错误或者更优解,请批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值