python 排序基础练习

python 排序基础练习
# 降序
#插入排序
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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注