选择、冒泡、插入排序算法总结

本文作的排序都是默认升序排序,即从小到大,此为大前提数组

----------------------------------------------------------------------------------------------------------------------------------------------------------------spa

l = [2, 5, 3, 6, 1, 4, 0, 9, 18, 11, 15, 12]

# 选择排序:依次拿一个元素(从第二个元素开始)和第一个位置元素比较,
# 若是比第一个元素小就交换位置,这样第一次循环结束,最小的数就放在了第一个,以此类推
# 第一层循环肯定元素要放的位置,因此i的取值范围是数组长度减1,由于最后一个不用比较了,确定是最大的,
# 第二层循环控制每次的循环次数,因此j的取值范围是i+1到数组的最后一个即len(l)
for i in range(len(l) - 1):
    for j in range(i+1, len(l)):
        if l[i] > l[j]:
            l[i], l[j] = l[j], l[i]
print(l)

 

# 冒泡排序:相邻的两个元素比较,后一个元素比前一个元素小,两个元素互换位置,
# 那么第一次循环结束,最大元素就到了数组的最后一个位置,以此类推
# 第一层i肯定总循环次数,总循环次数为数组长度减一,
# 例:只有一个元素的数组,是不用比较的,即比较次数为0,两个元素的数组,只需比较一次,比较次数=数组长度-1,以此类推
# 第二层j,控制每次循环比较的次数,比较次数是递减的,大循环(i)每执行一次,就少一个须要比较的值,因此j的取值范围是len(l)-i-1

for i in range(len(l)-1):
    for j in range( len(l)-i-1):
        if l[j] > l[j+1]:
            l[j], l[j+1] = l[j+1], l[j]
print(l)

 # 插入排序:数组能够分为两部分,一部分是有序数组,另外一部分是无序数组,从无序数组里依次取值,跟有序数组比较插入# i表明从无序数组取到值的下标,j表明有序数组里值的下标# i从第二个元素开始即下标起始值是1,因此i的取值范围是从数组的第二个值的下标(1)到数组的最后一个值的下标,code

# 第一个元素看做是有序数组的第一个元素即j的起始值, # j的起始值都是从i-1开始,依次递减,到0 for i in range(1, len(l)): x = l[i] # x表明未排序的值 j=i-1 for j in range(j, -2, -1): # j标记的是当前位置的值的下标 #j表明的是有序(默认升序)数组里的下标 if l[j] > x: # 若是有序数组里的最大值比未排序的值大,那么未排序的值就该往有序数组里插入,不然退出本次循环 l[j+1] = l[j] # 把有序数组的最大值的下标改成未排序值的下标,此时,未排序值就被摘出来了,由于未排序值的下标和已排序的最大值的下标对应的值是同样的,都是已排序数组的最大值
# 即把有序数组的最大值日后挪了一位,此时,下标为j和j+1指向的两个值是同样的
else: break # 若是第一次循环就执行到这里,此时j=i-1, 及j的值指向有序数组的最大值,那么下面那行代码不过是自己的值赋给原本的下标了 l[j+1] = x # 若是是最后一次,那么就是当前循环(i)找到的最小值,插入到下标为0(由于循环正常结束,j的值是-1)的地方 # 若是是中间次数,那么l[j]>x不成立,退出本次循环,此时,j已指向前一个值,好比上次循环j的值为3,那么下标3和4的值是同样的, # 由于3的值被赋给了4,那么本次循环j的值是2,因此j+1指向3,该值就插到了3的位置上,即比2的值大而且比4的值小
  
print(l)
相关文章
相关标签/搜索