Insertion Sort Integer Array & Insertion Sort Linked List

Sort Integer Array using Insertion sort.

//********************************************************************************************************
/* Insertion Sort 原理:就是前面的sort部分全部是相对值,从后面拿一个元素,然后跟前面的比较,
* 只要比最后一个小,就swap,然后cur-1, 然后continue swap,直到这个元素到达它应该在的位置,这样最后,这个array就被sort了。 */
public class InsertionSort {
  public void insertionSort(int[] array) {
    if(array == null || array.length == 1) return;
    for(int i=1; i<array.length; i++) {
      int temp = array[i];
      int j=i;
      while(j>=1 && array[j-1] > temp) {
        array[j] = array[j-1];
        j--;
      }
      array[j] = temp;
    }
  }
}

再联想到如何Sort a linked list using insertion sort.

思路:这个insertion sort,思想也是跟Array Insertion sort一样,就是找到相对位置正确的地点,然后插入进去。因为linked list只能一直向前搜索,所以,只能每次从头向后搜索,直到pre.next.val > cur.val的时候,再进行插入。dummpy的node一定要先把第一个点加入,然后进行比较,要insert就需要pre。

/**
 * 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 null;
        }
        ListNode dummpy = new ListNode(0);
        dummpy.next = head;
        ListNode pre = dummpy;
        // 因为linkedlist只能往前走,所以每次只能从头往后扫描,
        //找到pre.next.val > cur.val的位置停下来;注意这题,head要留在dummpy后面,
        //然后cut掉 head.next = null; 用cur去insert;
        ListNode cur = head.next;
        head.next = null;
        
        while(cur != null) {
            pre = dummpy;
            while(pre.next != null && pre.next.val < cur.val) {
                pre = pre.next;
            }
            
            ListNode curnext = cur.next;
            cur.next = pre.next;
            pre.next = cur;
            cur = curnext;
        }
        return dummpy.next;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值