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)

#我的思路

不落的月亮
0 声望1 粉丝

« 上一篇
dplyr
下一篇 »
机器学习PYTHON