标签:选择 比较 最好 highlight 循环 算法 pytho 需要 素数
插入排序的核心思想是将数组中所有的元素分别和前面已经排序好的元素相比较,如果后面选择的元素比已排序的元素小,则交换位置,直至比较完成。具体逻辑如下:
while版本
def myInsertSort(arr): for i in range(1,len(arr)):#默认第0号索引的元素是一个已经排好序的序列,所以从第一个元素开始 j = i#此时arr[:j]是一个已经排好序的序列,使用arr[i](arr[j+1])和arr[:j]依次作比较 while j>=1: if arr[j-1]>arr[j]: arr[j-1],arr[j] = arr[j],arr[j-1] else: break j-=1 return arr s = [93,28,1,1,2,3,4,5,6,2,3,4,5,-99,-98,-99,0] print(myInsertSort(s))
嵌套for版本
def myInsertSort(arr): for i in range(1,len(arr)):#默认第0号索引的元素是一个已经排好序的序列,所以从第一个元素开始 for j in range(i-1,-1,-1):#此时arr[:j]是一个已经排好序的序列,使用arr[i](arr[j+1])和arr[:j]依次作比较 if arr[j+1]<arr[j]: arr[j+1],arr[j] = arr[j],arr[j+1] else: break return arr s = [93,28,1,1,2,3,4,5,6,2,3,4,5,-99,-98,-99,0] print(myInsertSort(s))
外层for遍历读取第n个元素,当读取第n个元素的时候前面n-1个元素是已经排序好的序列,使用第n个元素和前面的n-1个元素进行依次比较,如果某一个元素比较的时候比第n个元素大,则交换该元素和第n个元素的位置,这样比较轮下来从第0个元素到第n个元素就是一个有序序列了。
在最好的情况下,即序列已经是排好序的情况下,每次比较一次就退出while循环,则总比较次数是n-1次,时间复杂度是O(n)
在最坏的情况下,即每次while循环都要比较到第一个元素,则:
第一次循环,比较了1次;
第二次循环,比较了2次;
...
第n-1次循环,比较了n-1次;
总的比较次数是1+2+3+...+(n-1) = n(n-1)/2。
我们上面所求得的n(n-1)/2,其时间复杂度,最大的影响因子是n^2/2,故其时间复杂度是O(n^2)。
标签:选择 比较 最好 highlight 循环 算法 pytho 需要 素数
原文地址:https://www.cnblogs.com/hyj691001/p/12013353.html