python之算法练习

1.冒泡排序

冒泡排序的核心思想是相邻的两个数据进行比较,假设数列A有n个数据,先比较第1个和第2个数据,如果A1 > A2,则交换他们的位置,确保较大的那个数在右侧。

接下来比较A2和A3,采用相同的规则,较大的数向右移动,最后会比较An-1 和An的大小,如果An-1 > An,那么交换他们的位置,这时,An是数列中的最大值。

你肯定已经发现,经过这一轮比较后,数列仍然是无序的,但是没有关系,我们已经找到了最大值An,而且它在队列的末尾。

接下来要做的事情,就是简单的重复之前的过程,整个数列,先暂时把An排除在外,这n-1个无序的数,仍然可以采用之前的方法,找出n-1个数当中的最大值,这样An-1就是第2大的数,继续对n-2个数做相同的事情。

1.1 冒泡排序示例:

#coding=utf-8;
#第一次排序,末位为最大数
def maopao(lst):
    for i in range(0,len(lst)-1):
        if lst[i]>lst[i+1]:             #两数比较大小,交换
            lst[i],lst[i+1]=lst[i+1],lst[i];
        print lst;
#len(lst)-1,需要5次循环,才能完成一次排序
def xunhuancount(lst):
    for i in range(len(lst),1,-1):
        maopao(lst);
if __name__ == "__main__":
    lst = [7,4,5,1,6,3];
   # maopao(lst);
    xunhuancount(lst);

运行结果:

[4, 7, 5, 1, 6, 3]
[4, 5, 7, 1, 6, 3]
[4, 5, 1, 7, 6, 3]
[4, 5, 1, 6, 7, 3]
[4, 5, 1, 6, 3, 7]
[4, 5, 1, 6, 3, 7]
[4, 1, 5, 6, 3, 7]
[4, 1, 5, 6, 3, 7]
[4, 1, 5, 3, 6, 7]
[4, 1, 5, 3, 6, 7]
[1, 4, 5, 3, 6, 7]
[1, 4, 5, 3, 6, 7]
[1, 4, 3, 5, 6, 7]
[1, 4, 3, 5, 6, 7]
[1, 4, 3, 5, 6, 7]
[1, 4, 3, 5, 6, 7]
[1, 3, 4, 5, 6, 7]
[1, 3, 4, 5, 6, 7]
[1, 3, 4, 5, 6, 7]
[1, 3, 4, 5, 6, 7]
[1, 3, 4, 5, 6, 7]
[1, 3, 4, 5, 6, 7]
[1, 3, 4, 5, 6, 7]
[1, 3, 4, 5, 6, 7]
[1, 3, 4, 5, 6, 7]

 2.插入排序

插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。

2.2 插入排序示例:

#coding=utf-8;
lst = [2, 6, 9, 3, 7, 1];
#利用sorted对原有函数进行排序,然后把要插入得数据插入到末位,再进行插入排序;
lstadd  = sorted(lst);
lstadd.append(5);
def insert(lsts):
    #创建两个变量存放插入的数据,和数据对应的索引。
    tem = lstadd[len(lstadd)-1];
    index = len(lstadd)-1;
    print lstadd,tem,index;
    while  index> 0 and lstadd[index-1]>lstadd[index]:
        print "into while list:",lstadd;
        #两个数比较大小,相互交换位置。
        lstadd[index] = lstadd[index-1];
        lstadd[index-1]=lstadd[index];
        #index=index-1:交换数据后插入数据的索引1
        index-=1;
        print "change index:",index;
        #交换数据后,交换数据所在位置:lstadd[indes]
        lstadd[index] = tem;2
    print lstadd;
if __name__ =="__main__":
    print lstadd;
    insert(lstadd);

 运行结果:

[1, 2, 3, 6, 7, 9, 5]
[1, 2, 3, 6, 7, 9, 5] 5 6
into while list: [1, 2, 3, 6, 7, 9, 5]
change index: 5
into while list: [1, 2, 3, 6, 7, 5, 9]
change index: 4
into while list: [1, 2, 3, 6, 5, 7, 9]
change index: 3
[1, 2, 3, 5, 6, 7, 9]

 3.排序算法

选择排序算法通过选择和交换来实现排序,其排序流程如下:
(1)首先从原始数组中选择最小的(或最大的)1个数据,将其和位于第1(n)个位置的数据交换。
(2)接着从剩下的n-1个数据中选择次小的1个元素,将其和第2(n)个位置的数据交换
(3)然后,这样不断重复,直到最后两个数据完成交换。最后,便完成了对原始数组的从小到大的排序

3.1 代码实现:

#coding=utf-8;
def select_sort(lst):
   for i in range(len(lst)):
       min = i ;
       print lst;
       for j in range(min,len(lst)):
           #内循环一次,找出最小值,放在首位。第二次从第二个位置开始找第二最小值,放在第二位置,依次。
           if lst[i] > lst[j]:
               lst[i],lst[j] = lst[j],lst[i];
               min = j;
               print "里面:",lst;
if __name__ == "__main__":
    lst = [5,2,1,9,3];
    select_sort(lst);
    print lst;

运行效果:

[5, 2, 1, 9, 3]
里面: [2, 5, 1, 9, 3]
里面: [1, 5, 2, 9, 3]
[1, 5, 2, 9, 3]
里面: [1, 2, 5, 9, 3]
[1, 2, 5, 9, 3]
里面: [1, 2, 3, 9, 5]
[1, 2, 3, 9, 5]
里面: [1, 2, 3, 5, 9]
[1, 2, 3, 5, 9]
[1, 2, 3, 5, 9]

 

posted @ 2022-09-27 14:44  家乐福的搬砖日常  阅读(144)  评论(0)    收藏  举报