算法导论之插入排序

元宇宙
• 阅读 2292

插入排序

原理:从第二个数开始,依次与前面的进行比较(此时前面的数是有序的),找到合适的位置进行插入,比较的过程同时进行移动操作。

循环方式:
python 代码:

from random import randint
def insertion_sort():
#generate a unsorted list
origin = []
for i in xrange(0,10,1):
    origin.append(randint(1,10))
#insertion sort
print origin
for i in xrange(1,len(origin),1):
    key = origin[i]
    j = i-1
    while j >= 0 and origin[j] > key:
        origin[j+1] = origin[j]
        j -= 1
    origin[j+1] = key
print origin
if __name__ == "__main__":
insertion_sort()

java 代码:

package blog.algorithm;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class InsertionSort {
    public static void main(String args[]){
        System.out.println("begin...");
        List<Integer> origin = new ArrayList<Integer>();
        int count = 10;
        Random rd = new Random();
        while(count > 0){
            int i = rd.nextInt(100);
            origin.add(i);
            count--;
            System.out.print("" + i + "  ");
        }
        System.out.println();
        int key;
        for(int i = 0,len = origin.size(); i < len; i++){
            key = origin.get(i);
            int j = i - 1;
            for(;j >= 0 && origin.get(j) > key;j--){
                origin.set(j+1, origin.get(j));
            }
            origin.set(j+1, key);
        }
        for(int i = 0,len = origin.size(); i < len; i++){
            System.out.print("" + origin.get(i) + "  ");
        }
    }
}

递归方式(未作尾递归优化):

# -*- coding: utf-8 -*-
#!/usr/bin/env python
from random import randint

#generate a unsorted list
origin = []
def randomList():
    for i in xrange(0,10,1):
        origin.append(randint(-10,10))
    # print origin

def insert_recursion_sort(origin,begin):
    next = begin + 1
    while begin > 0:
        if origin[begin -1] > origin[begin]:
            origin[begin -1] = origin[begin] + origin[begin -1]
            origin[begin] = origin[begin-1] - origin[begin]
            origin[begin-1] = origin[begin-1] - origin[begin]
        begin -= 1
    if next < len(origin):
        insert_recursion_sort(origin, next)

def merge_sort(origin,begin,end):
    if begin < end:
        middle = (end + begin)/2
        merge_sort(origin, begin, middle)
        merge_sort(origin, middle + 1, end)
        merge(origin, begin, middle, end)

if __name__ == '__main__':
    randomList()
    print origin
    insert_recursion_sort(origin, 1)
    print origin
点赞
收藏
评论区
推荐文章
22 22
4年前
【排序算法动画解】直接插入排序
本文为系列专题的第14篇文章。1.2.3.4.5.6.7.8.9.10.11.12.13.前面介绍了已经介绍了三种排序,暴力排序、冒泡排序和简单选择排序,一个共同点都是基于交换。我们可以用另一种视角来看待排序,即将一个待排序的数组看成两个部分:有序区和乱序区。在排序开始前,整个数组都是乱序区,而有序区则为空:排序开始后,有序区
Stella981 Stella981
3年前
50道Java集合经典面试题(收藏版)
前言来了来了,50道Java集合面试题来了!1\.Arraylist与LinkedList区别可以从它们的底层数据结构、效率、开销进行阐述哈ArrayList是数组的数据结构,LinkedList是链表的数据结构。随机访问的时候,ArrayList的效率比较高,因为LinkedList要移动指针,而
Stella981 Stella981
3年前
C语言 插入排序 Insert Sort
include<stdio.hvoidexchange(intarray,intp1,intp2){if(p1p2)return;inttemparrayp1;arrayp1arrayp2;arrayp
Stella981 Stella981
3年前
Python常用算法(一)
1.选择排序不断找到最小的(找最大的也是可以的)首先拿到第一个,然后发现比它小的,记住下标。循环一轮,找到最小的数的位置和最左边的数交换位置然后从第二个开始....和第二个交换位置,循环最后变得有序codingutf8defselect_sort(list):foriin
Stella981 Stella981
3年前
Python递归函数、匿名函数、过滤函数
递归函数Python对递归的深度有限制,超过即会报错。所以一定一要注意跳出条件。斐波拉契数列一个数列,第一个数是1,第二个数也是1,从第三个数开始,每一个数是前两个数之和公式:f(1)1,f(2)1,f(3)f(1)f(2),...,f(n)f(n2)f(n1)
Wesley13 Wesley13
3年前
Java面试总结(排序算法)
1.冒泡排序算法描述:两两比较,大的放后面2.选择排序算法描述:在m元数组中找到最小值的位置,然后将最小值的位置和第n(n0,1,2,....m1)位的值对调,排序k次则m元数组中前k(k<m)位的值已经排序好,m元数组中前k位的值不需要再进行排序,此时需要排序的元素只有mk个3.插入排序算
Stella981 Stella981
3年前
C语言 冒泡排序 Bubble Sort
算法描述:有数组array,其长度为len。第一轮工作从末尾开始往前比较工作。如果末尾数据比他前一位数据大,则交换他们的位置,否则则不交换。无论本次比较的结果是交还是不交换,这两个数据都遵循了前一个数据比后一个数据大的结果。接下里向前移动一个工作位置,重复以上的操作。这样一轮比较结束。大的数据不断往前移动。如果他是最大的,就会一直往前移动。如果不是则说明数组
Stella981 Stella981
3年前
Shell(希尔)排序
Shell(希尔)排序    对于直接插入排序而言,如果一个很小的数据单元位于很靠近右端的位置上,为了把这个数据单元移动到左边正确的位置上,中间所有的数据单元都需要向右移动一格。这个步骤对每一个数据项都执行了近n次复制。虽然不是所有的数据项都必须移动n个位置,但平均下来,每个数据项都会移动n/2格,总共是n\n/2次复制。因此,直接插入
Wesley13 Wesley13
3年前
Java排序算法之选择排序
1\.基本思想选择排序(selectsorting)的基本思想是:1)对于一个大小为n的数组,选择排序共执行n1轮排序2)每轮排序寻找到该轮最小的数放到开始位置上:先假定当前这个数是最小数然后和后面的每个数进行比较,如果发现有比当前数更小的数,就重新确定最小数,得到下标当遍历到数组的最
Wesley13 Wesley13
3年前
279,对链表进行插入排序
对链表进行插入排序。!(https://oscimg.oschina.net/oscnet/9dfd592075eb9c212bf1eabe9e8ecb60522.gif)插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。
菜园前端 菜园前端
2年前
什么是插入排序?
原文链接:什么是插入排序(insertionSort)?在数组中从左到右依次取一个数出来,然后把它放到合适的位置。从思想上可以分为有序区和无序区,有序区在左边代表已经排列好的元素。算法步骤1.默认左边第一个元素已经在有序区了2.在无序区取一个数出来(第二个