# 降序
#插入排序
def list_change(xulie):
for j in range(1,len(xulie)): # 确定循环次数
print("待比较的值是:",xulie[j],"区域范围是0~",j)
#for i in range(j-1,-1,-1): # 大范围内的循环,疆
while j>=1:
if xulie[j-1] > xulie[j]:
xulie[j-1],xulie[j] = xulie[j],xulie[j-1]
j -= 1
print(j,">>",xulie)
else:
break
print(xulie)
# 希尔排序
def shell_sort(alist):
if not alist:
return
n=len(alist)
gap=n//2
while gap>0:
for i in range(gap,n):
while i-gap>=0:
if alist[i]<alist[i-gap]:
alist[i],alist[i-gap]=alist[i-gap],alist[i]
i-=gap
else:
break
print(gap,":",alist)
gap//=2
# 冒泡排序的思路在于把每一次遍历结果的最小值放在最左边,下一次遍历时,缩小范围
def maopao(x):
for i in range(len(x)):
print(f"第{i}次排序:待排序的区域范围是{0}~{len(x)-i-1}")
for j in range(1,len(x)-i):
if x[j] < x [j-1]:
x[j],x[j-1]= x[j-1],x[j]
print(j, ">>", xulie)
print(x)
# 冒泡排序的改进版鸡尾酒排序
def jiweijiu(x):
count=0
for i in range(len(x)):
print(f"第{i}次排序:待排序的区域范围是{0}~{len(x)-i-1}")
for j in range(i,len(x)-i):
print(j, ">>", xulie)
if x[j] < x [j-1]:
x[j],x[j-1]= x[j-1],x[j]
count +=1
for j in range(len(x)-i-1,i,-1):
print(j, "<<", xulie)
if x[j] < x[j - 1]:
x[j], x[j - 1] = x[j - 1], x[j]
count += 1
print(f"总共完成{count}次排序 ,结果为{x}")
#选择排序,每一次遍历将序列中找到最小值,并放置到序列前。指针法
def choose_sort(x):
for i in range(len(x)):
print(f"第{i}次排序:待排序的区域范围是{i}~{len(x)-1}")
min = x[i]
t=i
for j in range(i,len(x)):
if x[j]<min:
t=j
min = x[j]
print(f"第{i}次查找:{x},最小值位置在{t},值为{min}",)
x[i],x[t] = x[t],x[i]
print(x)
# 最值排序2,选择排序的一种。总结,排序方法千万种,优化效率,有效降低时间复杂度是更高阶排序方法的所追求的。将选择到最值放在做左侧
def zuizhi(raw):
for i in range(len(raw)):
print(f"第{i}次排序:{raw}")
for j in range(i, len(raw)):
if raw[i] > raw[j]:
raw[i], raw[j] = raw[j], raw[i]
print(f"发生一次{i}和{j}的交换,交换后结果为{raw}")
print(raw)
1、关于排序有多种方法,本次练习仅在理解范围内,选择了,插入排序、选择排序、冒泡排序、希尔排序进行练习。
2、除了希尔排序的时间复杂度较低O(nlogn),其他排序都是O(n^2)
3、本次练习中所有排序的思路基本一致,就是进行一次大循环,每一次循环,都完成一次遍历并完成目标任务(规定动作)。只要规定动作保持一致,并限定在规定范围内处理,就可以达成排序效果。
比如,冒泡排序的要求是,一次循环将最大或最小值,移动到右侧,下一次循环时缩小遍历范围;插入排序,通过不断插入数值,使得原有有序的范围不断扩大,直到整个序列都为有序;选择排序,每一次循环遍历时都将最小值通过索引或者交换的方式,移动到最左侧,并相应缩小遍历范围。希尔排序是利用斐波那契数列的原理,优化了插入排序,最后一个步长gap=1
4、排序的过程要确定,符合怎样条件的哪两个值之间,如何交换位置,规则是什么,每次循环遍历的范围是什么。
5、排序方法多种多样
6、对于python而言,sort似乎最为便捷。sort方法,返回值为None,列表本身被修改。sorted函数是返回一个新的有序列表。sort默认均为升序。reversed函数是反转原有序列,并不做排序处理比如:
xulie = [9,8,7,16,5,4,3,2,1,0] xulie2 = [0, 1, 2, 3, 4, 5, 16, 7, 8, 9] print(xulie.sort(reverse=True),xulie) print(sorted(xulie2,reverse=True),xulie2) print(list(reversed(xulie2)),xulie2)
None [16, 9, 8, 7, 5, 4, 3, 2, 1, 0] [16, 9, 8, 7, 5, 4, 3, 2, 1, 0] [0, 1, 2, 3, 4, 5, 16, 7, 8, 9] [9, 8, 7, 16, 5, 4, 3, 2, 1, 0] [0, 1, 2, 3, 4, 5, 16, 7, 8, 9] Process finished with exit code 0