1.内部排序
1.1直接插入排序
class ElemType:
def __init__(self, key, otherinfo=None):
self.key = key # 关键字域
self.otherinfo = otherinfo # 其他域
def insert_sort(r):
# 对顺序表r做直接插入排序
for i in range(2, len(r)):
if r[i].key < r[i - 1].key: # “<”,需将r[i]插入有序子表
r[0] = r[i] # 将待插入的记录暂存到监视哨中
r[i] = r[i - 1] # r[i-1]后移
j = i - 2
while r[0].key < r[j].key: # 从后向前寻找插入位置
r[j + 1] = r[j] # 记录逐个后移,直到找到插入位置
j -= 1
r[j + 1] = r[0] # 将r[0]即原r[i],插入到正确位置
return r
if __name__ == '__main__':
input_string = input('请输入要排序的整数序列,用空格隔开:')
nums = input_string.split(' ') # 分隔输入串
r = [ElemType(key=None)] + [ElemType(int(i)) for i in nums] # 下标0添加一个空位
print('直接插入排序的结果为:', [_.key for _ in insert_sort(r)[1:]]) # 不输出用于辅助的第一位
49 38 65 97 76 13 27 49-
i=2 38<49 r[0]=38 r[2]=49 j=0 r[1]=38 38=38
38 (38 49) 65 97 76 13 27 49-
i=3 65>49
38 (38 49 65) 97 76 13 27 49-
i=4 97>65
38 (38 49 65 97) 76 13 27 49-
i=5 76<97 r[0]=76 r[5]=97 j=3 76>75 r[4]=76
76 (38 49 65 76 97) 13 27 49-
i=6 13<97 r[0]=13 r[6]=97 j=4 13<76 r[5]=76 j=3 13<65 r[4]=65 j=2 13<49 r[3]=49 j=1 13<38 r[2]=38 j=0 13=13
13 (13 38 49 65 76 97) 27 49-
i=7 27<97 r[0]=27 r[7]=97 j=5 27<76 r[6]=76 j=4 27<65 r[5]=65 j=3 27<49 r[4]=49 j=2 27<38 r[3]=38 j=1 27>13
27 (13 27 38 49 65 76 97) 49-
i=8 49-<97 r[0]=49- r[8]=97 j=6 49-<76 r[7]=76 j=5 49-<65 r[6]=65 j=4 49-=49
49- (13 27 38 49 49- 65 76 97)
#我的思路
input_string = input()
nums = input_string.split(' ')
r = [int(i) for i in nums]
for i in range(1,len(r)):
for j in range(0, i):
if r[i] < r[j]:
rt = r[i]
r[j+1:i+1] = r[j:i]
r[j] = rt
break
print(r)
1.2折半插入排序
class ElemType:
def __init__(self, key, otherinfo=None):
self.key = key # 关键字域
self.otherinfo = otherinfo # 其他域
def b_insert_sort(r):
# 对顺序表r做折半插入排序
for i in range(2, len(r)):
r[0] = r[i] # 将待插入的记录暂存到监视哨中
low = 1
high = i - 1 # 置查找区间初值
while low <= high: # 在r[low..high]中折半查找插入的位置
m = int((low + high) / 2) # 折半
if r[0].key < r[m].key:
high = m - 1 # 插入点在前一子表
else:
low = m + 1 # 插入点在后一子表
for j in range(i - 1, high, -1):
r[j + 1] = r[j] # 记录后移
r[high + 1] = r[0] # 将r[0]即原r[i],插入到正确位置
return r
if __name__ == '__main__':
input_string = input('请输入要排序的整数序列,用空格隔开:')
nums = input_string.split(' ') # 分隔输入串
r = [ElemType(key=None)] + [ElemType(int(i)) for i in nums] # 下标0添加一个空位
print('折半插入排序的结果为:', [_.key for _ in b_insert_sort(r)[1:]]) # 不输出用于辅助的第一位
49 38 65 97 76 13 27 49-
i=2 r[0]=38 low=1 high=1 1=1 m=1 38<49 high=0 1>0 j=1 r[2]=49 r[1]=38
38 (38 49) 65 97 76 13 27 49-
i=3 r[0]=65 low=1 high=2 1<2 m=1 65>38 low=2 2=2 m=2 65>49 low=3 3>2 j=2 r[3]=65
65 (38 49 65) 97 76 13 27 49-
i=4 r[0]=97 low=1 high=3 1<3 m=2 97>49 low=3 3=3 m=3 97>65 4>3 j=3 r[4]=97
97 (38 49 65 97) 76 13 27 49-
i=5 r[0]=76 low=1 high=4 1<4 m=2 76>49 low=3 3<4 m=3 76>65 low=4 4=4 m=4 76<97 high=3 4>3 j=4 r[5]=97 j=3 r[4]=76
76 (38 49 65 76 97) 13 27 49-
i=6 r[0]=13 low=1 high=5 1<5 m=3 13<65 high=2 1<2 m=1 13<38 high=1 1=1 m=1 13<38 high=0 1>0 j=5 r[6]=97 j=4 r[5]=76 j=3 r[4]=65 j=2 r[3]=49 j=1 r[2]=38 j=0 r[1]=13
13 (13 38 49 65 76 97) 27 49-
i=7 r[0]=13 low=1 high=6 1<5 m=3 27<49 high=2 1<2 m=1 27>13 low=2 2=2 m=2 27<38 high=1 2>1 j=6 r[7]=97 j=5 r[6]=76 j=4 r[5]=65 j=3 r[4]=49 j=2 r[3]=38 j=1 r[2]=27
27 (13 27 38 49 65 76 97) 49-
i=8 r[0]=49- low=1 high=7 1<7 m=4 49-=49 low=5 5<7 m=6 49-<76 high=5 5=5 m=5 49-<65 high=4 5>4 j=7 r[8]=97 j=6 r[7]=76 j=5 r[6]=65 j=4 r[5]=49-
49- (13 27 38 49 49- 65 76 97)
#我的思路
input_string = input()
nums = input_string.split(' ')
r = [int(i) for i in nums]
for i in range(1,len(r)):
low = 0
high = i
while low<=high:
m = int((low+high)/2)
if r[i]<r[m]:
if r[i] > r[m-1] or m == 0:
rt = r[i]
r[m+1:i+1] = r[m:i]
r[m] = rt
break
high = m-1
else:
if r[i] < r[m+1] or m+1 == i:
rt = r[i]
r[m+2:i+1] = r[m+1:i]
r[m+1] = rt
break
low = m+1
print(r)
1.3希尔排序
class ElemType:
def __init__(self, key, otherinfo=None):
self.key = key # 关键字域
self.otherinfo = otherinfo # 其他域
def shell_insert(r, dk):
# 对顺序表r做一趟增量是dk的希尔插入排序
for i in range(dk + 1, len(r)):
if r[i].key < r[i - dk].key: # 需将r[i]插入有序增量子表
r[0] = r[i] # 暂存在L.r[0]
j = i - dk
while j > 0 and r[0].key < r[j].key:
r[j + dk] = r[j] # 记录后移,直到找到插入位置
j -= dk
r[j + dk] = r[0] # 将r[0]即原r[i],插入到正确位置
return r
def shell_sort(r, dt):
# 按增量序列dt[0..t-1]对顺序表r作t趟希尔排序
for dk in dt:
r = shell_insert(r, dk) # 一趟增量为dt[t]的希尔插入排序
return r
if __name__ == '__main__':
input_string = input('请输入要排序的整数序列,用空格隔开:')
nums = input_string.split(' ') # 分隔输入串
r = [ElemType(key=None)] + [ElemType(int(i)) for i in nums] # 下标0添加一个空位
dt = [5, 3, 1] # dt数组
print('希尔排序的结果为:', [_.key for _ in shell_sort(r, dt)[1:]]) # 不输出用于辅助的第一位
49 38 65 97 76 13 27 49-
dk=5 i=6 13<49 r[0]=13 j=1 13<49 r[6]=49 j=-4 r[1]=13 i=7 27<38 r[0]=27 j=2 27<38 r[7]=38 j=-3 r[2]=38 i=8 49-<65 r[0]=49- j=3 49-<65 r[8]=65 j=-2 r[2]=49-
49- 13 27 49- 49 38 76 65 97
dk=3 i=4 65>13 i=5 97>27 i=6 76>49- i=7 49<65 r[0]=49 j=4 49<65 r[7]=65 j=1 49>13 r[4]=49 i=8 38<97 r[0]=38 j=6 38<97 r[8]=97 j=3 38>27 r[5]=38
38 13 27 49- 65 97 76 49 38
dk=1 直接插入排序
38 (13 27 38 49 49- 65 76 97)
#我的思路
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。