rosyhuan

一、算法描述

插入排序:插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序。例如有一个长度为N的无序数组,进行N-1次的插入即能完成排序;第一次,数组第1个数认为是有序的数组,将数组第二个元素插入仅有1个有序的数组中;第二次,数组前两个元素组成有序的数组,将数组第三个元素插入由两个元素构成的有序数组中......第N-1次,数组前N-1个元素组成有序的数组,将数组的第N个元素插入由N-1个元素构成的有序数组中,则完成了整个插入排序。

要点:设立哨兵,作为临时存储和判断数组边界之用

插入过程举例:

二、算法分析

算法分析:1.当元素的初始序列为正序时,仅外循环要进行n-1趟排序且每一趟只进行一次比较,没有进入if语句不存在元素之间的交换(移动)。此时比较次数(Cmin)和移动次数(Mmin)达到                  最小值。

                 Cmin = n-1    Mmin = 0;

                此时时间复杂度为O(n)。

              2.当元素的初始序列为反序时,每趟排序中待插入的元素都要和[0,i-1]中的i个元素进行比较且要将这i个元素后移(arr[j+1] = arr[j]),i个元素后移移动次数当然也就为i                    了,再加上temp = arr[i]与arr[j+1] = temp的两次移动,每趟移动的次数为i+2,此时比较次数(Cmin)和移动次数(Mmin)达到最小值。

                 Cmax = 1+2+...+(n-1) = n*(n-1)/2 = O(n2)

                 Mmax = (1+2)+(2+2)+...+(n-1+2) = (n-1)*(n+4)/2 = O(n2)  (i取值范围1~n-1)

                 此时时间复杂度为O(n2)。

              3.在直接插入排序中只使用了i,j,temp这3个辅助元素,与问题规模无关,所以空间复杂度为O(1).

              4.在整个排序结束后,即使有相同元素它们的相对位置也没有发生变化,

                  如:5,3,2,3排序过程如下

                     A--3,5,2,3

                     B--2,3,5,3

                     C--2,3,3,5

                   排序结束后两个元素3的相对位置没有发生改变,所以直接插入排序是一种稳定排序。

三、算法实现

 1 #/usr/bin/python
 2 # -*- coding:utf-8 -*-
 3 
 4 
 5 a=[3,5,2,1,4,7,9,3,4,5,7]
 6 def insert_sort(a):
 7     alen=len(a)
 8     print("数组长度len="+str(alen))
 9     for j in range(alen):
10         temp=a[j]
11         print("哨兵temp="+str(temp))
12         i=j
13         print("i="+str(i))
14         if(j==0):
15           continue
16         if(temp<a[i-1]):
17            while((temp<a[i-1]) and (i>0)):
18               a[i]=a[i-1]
19               i=i-1
20            print("插入的位置 i ="+str(i))
21            a[i]=temp
22         j=j+1
23         print(a)
24         print("------------------------------------")
25 insert_sort(a)

 

分类:

技术点:

相关文章:

  • 2021-12-05
  • 2021-09-21
  • 2022-12-23
  • 2021-11-05
  • 2021-07-22
  • 2020-07-25
猜你喜欢
  • 2021-11-05
  • 2022-03-01
  • 2021-11-09
  • 2022-01-06
  • 2021-11-23
  • 2021-08-19
  • 2021-11-22
相关资源
相似解决方案