序列的排序

序列的排序

是什么?

将一串无序的序列进行有序地排列,使之成为有序序列。

解法?

方法1(选择排序):

a=[]
for i in input().split(' '):
     a.append(eval(i))
b=len(a)
for j in range(0,len(a))://将第一个分别与后面几个数字相比较,若第一个数比它后面的数要小,则将第一个数与其对换;再将第二数像上述一样进行操作,以此类推。
for k in range(j+1,len(a)):
if a[j]>a[k]:
a[j],a[k]
=a[k],a[j]
print(a)

方法2(插入排序):

a=[]
for i in input().split(' '):
     a.append(eval(i))
b=len(a)
for i in range(1,b)://表示将第一个数看成有序的,我们从列表的第二个数开始。将第二个数与第一个数相比较,若第一个数小于第二个数,则跳出内循环,再将数放置再原来的位置的位置;若第一个数大于第二个数,则将第一个数往后移一位,直到大于标记的item,再将item插入到此位置中。
    item=a[i]
    for j in range(i-1,-2,-1):
        if item<a[j]:
            a[j+1]=a[j]
        else:
            break
    a[j+1]=item
print(a)

 方法3(将插入排序改成递归):

def diguipaixu(x,y,z):
    if y==z:
        return x
    item=x[y]
    for i in range(y-1,-2,-1):
        if x[i]>item:
            x[i+1]=x[i]
        else:
            break
    x[i+1]=item
    diguipaixu(x,y+1,z)//直接将递归当成循环来使用,递归本身就类似于循环。          
a
=[] for i in input().split(' '): a.append(eval(i)) b=len(a) diguipaixu(a,1,b) print(a)

 方法4(冒泡排序):

a=[]
for i in input().split(' '):
    a.append(eval(i))
c=len(a)
for j in range(0,c-1)://N个无序的数用冒泡排序需要进行N-1次的冒泡
    for k in range(0,c-1):
        if a[k]>a[k+1]:
            a[k],a[k+1]=a[k+1],a[k] //相邻两个元素之间进行比较,若前面的大于后面的数,则进行交换。
print(a)

 方法5(希尔排序):

思路:将一串无序的序列通过分组来进行排序,通过一次次的组内排序使得无序序列成为有序序列。(在分组中排序运用的是插入排序方法)

如下图分析可

 

a=[]
for i in input().split(' '):
     a.append(eval(i))
n=m=len(a)
while m>1:
    m=m//2 //确定需要几次分组
    for j in range(m,n): //以下代码的理解与插入排序的代码理解一样。只不过插入排序之间是以1分组,而希尔排序是第一次次以序列长度2的整除来分组,其他几次相同方法,只要搞懂,写出第一次分组就可以。
        item=a[j]
        for k in range(j-m,-(m+1),-m):
            if a[k]>item:
                a[k+m]=a[k]
            else:
                 break
        a[k+m]=item
print(a)

希尔排序(具有三层循环)记忆理解方法:希尔排序是先将无序的序列按照某种规律进行多次分组后,再将每次分成的组的内部序列按照插入排序排好,最终得到一个有序的序列。而插入排序是希尔排序的一种特殊的排序,是以1为分组大小。因而,我们可以先通过一串无序的序列来确定需要进行几次分组的第一层循环。之后的两层循环可以根据插入循环的代码进行修改其中的值,格式不变。

方法6(快速排序):

具体单独看快速排序的文章

 

posted @ 2022-02-22 22:58  天空之城—我的理想国  阅读(205)  评论(0)    收藏  举报