Insertion sort

Input: A sequence of n numbers [a1,a2,...,an]

Output: a permutation (reordering) [a1‘,a2‘,...,an‘] of the input sequence such that a1‘ <=a2‘ <= ... <= an‘.

array = [2,4,5,22,6,34,2,5,1,3,6,9,7,8]
print array
def insertSort(array):
    for i in xrange(1,len(array)):
        # key as a temp room for a certain element in a certain step
        key = array[i]
        j  = i - 1
        while j >=0 and array[j] > key:
            array[j+1]  = array[j]
            j = j - 1
        array[j+1] = key # loop still running till last step, so j = j - 1
        print array
    return array

insertSort(array)
# output

[2, 4, 5, 22, 6, 34, 2, 5, 1, 3, 6, 9, 7, 8]
[2, 4, 5, 22, 6, 34, 2, 5, 1, 3, 6, 9, 7, 8]
[2, 4, 5, 22, 6, 34, 2, 5, 1, 3, 6, 9, 7, 8]
[2, 4, 5, 22, 6, 34, 2, 5, 1, 3, 6, 9, 7, 8]
[2, 4, 5, 6, 22, 34, 2, 5, 1, 3, 6, 9, 7, 8]
[2, 4, 5, 6, 22, 34, 2, 5, 1, 3, 6, 9, 7, 8]
[2, 2, 4, 5, 6, 22, 34, 5, 1, 3, 6, 9, 7, 8]
[2, 2, 4, 5, 5, 6, 22, 34, 1, 3, 6, 9, 7, 8]
[1, 2, 2, 4, 5, 5, 6, 22, 34, 3, 6, 9, 7, 8]
[1, 2, 2, 3, 4, 5, 5, 6, 22, 34, 6, 9, 7, 8]
[1, 2, 2, 3, 4, 5, 5, 6, 6, 22, 34, 9, 7, 8]
[1, 2, 2, 3, 4, 5, 5, 6, 6, 9, 22, 34, 7, 8]
[1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 9, 22, 34, 8]
[1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 22, 34]

Here, we use loop invariants to help us understand why an algorithms is correct:

Initialization: It is true prior to the first iteration of the loop;

Maintenance: If it is true before an iteration of the loop, it remains true before the next iteration

Termination: When the loop terminates, the invariant gives us a useful property that helps show that the algorithm is correct.

This is the first alogorithm, and its idea behind is simple and naive: for aj, we just compare it with the element just before it ( change, if a(j-1) >a(j) and then exchange index, else stop and go to sort next element(a(j+1)); loop till to all the elements done~

时间: 2024-09-29 00:31:34

Insertion sort的相关文章

[LeetCode]Insertion Sort

Sort a linked list using insertion sort. 这道题是要求用插入排序的方式对单链表进行排序. 先不考虑边界情况: 1. 将第一个结点看做有序区,之后的所有结点看做无序区. 2. 从第二个结点p开始,遍历有序区,知道遇到比结点p值大的结点q,将结点p插入到结点q之前. 3. 重复上述步骤直到链表遍历结束. 需要注意的是: 1. 遍历无序区时,需要保存当前结点的后继结点,以防指针丢失. 2. 若原链表为空,则直接返回NULL. 下面贴上代码: /** * Defi

【LeetCode】Insertion Sort List

题目 Sort a linked list using insertion sort. 解答 链表无法像数组那样从后往前依次比较插入,只能从前往后:在链表首部添加一个哨兵可以稍微简化下代码,代码如下: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * }

LeetCode Insertion Sort List

class Solution { public: ListNode *insertionSortList(ListNode *head) { if (head == NULL) return NULL; ListNode* sorted_head = head; ListNode* unsorted_head = head->next; head->next = NULL; ListNode* cur = unsorted_head; while (cur != NULL) { unsorte

Insertion Sort List(单链表插入排序)

来源:https://leetcode.com/problems/insertion-sort-list Sort a linked list using insertion sort. 方法: 1. 使用一个preHead指向头节点,这样在将节点插入头节点前面时(即某个节点值比头节点小)不需要进行特殊处理 2. 从头节点开始遍历,如果当前节点的下一个节点的值比当前节点的值大,就从头开始遍历找到第一个比当前节点的下一个节点的值大的节点,并插入到它的前面,注意插入时需要同时处理节点移出位置和插入位

147. Insertion Sort List

题目: Sort a linked list using insertion sort. 思路: 链表的插入排序和数组的插入排序略有不同.以链表4->2->3->1->5为例,为方便操作添加一个头节点-1,此时链表为-1->4->2->3->1->5.基本思路为一次选择前后两个节点,若后节点大于前节点则不断向后循环,若后节点小于前节点则取出后节点,并插入到头节点和前节点之间的位置. 举例说明: 头节点为-1,cur为节点4,nextnode为节点2.此

直接插入排序(Straight Insertion Sort)的C语言实现

原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia 直接插入排序(Straight Insertion Sort)的基本思想是将新记录插入到已经排好序的有序表中,初始有序表只有无序表的第一个数据,依次对无序表每个数据进行直接插入排序,从而得到了有序表,具体步骤为 若新记录<有序表高位l.r[j],则设置哨兵 有序表后移,j+1=j 重复第2步,直至新纪录>=有序表中的j记录,则j+1就是要插入的位置 从而得到一个新的.记录数增加1的有序表

折半插入排序(Binary Insertion Sort)的C语言实现

原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia 折半插入排序(Binary Insertion Sort)的基本思想是将新记录插入到已经排好序的有序表中,初始有序表只有无序表的第一个数据,依次对无序表每个数据进行折半插入排序,从而得到了有序表,具体步骤为 先将记录存在L.r[0]中,low=有序表低位下标,high=有序表高位下标 若low<=high,就将L.r[0]与mid=(low+high)/2位的数据比较,如果L.r[0]>

排序算法一:插入排序(Insertion sort)

最近从网易公开课在看麻省理工学院的公开课<算法导论>,感觉还不错,接下来几篇文章所示学习日记了,不准备对算法细节做过多描述,感兴趣的可以自己去看. 文章分几篇讲经典排序算法,直接上代码,根据结果对算法性能有个直观了解.本篇先说插入排序(insertion sort). (一)算法实现 1 protected void sort(int[] toSort) { 2 if (toSort.length <= 1) { 3 return; 4 } 5 for (int i = 1; i <

Java for LeetCode 147 Insertion Sort List

Sort a linked list using insertion sort. 解题思路: 插入排序,JAVA实现如下: public ListNode insertionSortList(ListNode head) { if(head==null||head.next==null) return head; ListNode root=new ListNode(Integer.MIN_VALUE); root.next=head; head=head.next; root.next.nex

leetcode:Insertion Sort List

Sort a linked list using insertion sort. 分析:此题要求在链表上实现插入排序. 思路:插入排序是一种O(n^2)复杂度的算法,基本想法就是每次循环找到一个元素在当前排好的结果中相对应的位置然后插进去,经过n次迭代之后就能得到排好序的结果. 可以这么做:建立一个helper头结点,然后依次将head链表中的结点有序的插入到helper链表中 代码: /** * Definition for singly-linked list. * struct ListN