本文做的排序都是默认升序排序,即从小到大,此为大前提
----------------------------------------------------------------------------------------------------------------------------------------------------------------
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)到数组的最后一个值的下标,
# 第一个元素看作是有序数组的第一个元素即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)