python基础-5.1几种常见的排序算法

一、冒泡排序(BubbleSort)

步骤:

  • 比较相邻的元素,如果第一个比第二个大,就交换他们两个。
  • 循环一遍后,最大的数就“浮”到了列表最后的位置。
  • 将剩下的数再次循环,直道所有的排序完成
 1 def BubbleSort(li):
 2     le = len(li)
 3     while le > 0:
 4         for i in range(le - 1):
 5             if li[i] > li[i + 1]:
 6                 li[i] = li[i] + li[i + 1]
 7                 li[i + 1] = li[i] - li[i + 1]
 8                 li[i] = li[i] - li[i + 1]
 9         le -= 1
10     return li 
11 li = [1, 22, 11, 55, 23, 33, 12, 56, 4, 7]
12 print(BubbleSort(li))

二、选择排序 SelectionSort

步骤:

  • 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
  • 再从剩余未排序元素中继续寻找最小(大)元素,然后放到排序序列的起始。
  • 循环下去,直道所有的数排序完成
1 s = [3, 4, 1, 6, 2, 9, 7, 0, 8, 5]
2 
3 for i in range(len(s)-1):
4     index=i                     #选定当前值的索引,作为最小值得索引
5     for j in range(i+1,len(s)):    #将这个值以后的值做循环
6         if s[index]>s[j]:          #与之后的值一一对比
7             index=j                #记下最小元素的下标
8     s[i],s[index]=s[index],s[i]    #将最小元素放到列表起始位置
9 print(s)

三、插入排序 InsertionSort

步骤:

  • 从第一个元素开始可以认为已经被排序,取出下一个元素,在已经排序的元素序列中从后向前扫描
  • 如果该元素(已排序)大于新元素,将该元素移到下一位置,直到找到已排序的元素小于或者等于新元素的位置
  • 将新元素插入到该位置后,如此反复循环,直道所有的排好序

代码如下:

 1 def InsertionSort(l):
 2     for i in range(1,len(l)):
 3         if l[i]<l[i-1]:
 4             temp=l[i]                               # 应该插入的数赋值给变量temp
 5             for j in range(i-1,-1,-1):              # 从已排好的序列往前循环
 6                 if l[j]>temp:
 7                     l[j+1] = l[j]
 8                     index=j                         # 记下应该插入的位置
 9                 else:
10                     break
11             l[index]=temp
12     return l
13 print(InsertionSort([555,2,3,2,3,1,19,3.5,27,24]))   # [1, 2, 2, 3, 3, 3.5, 19, 24, 27, 555]

四、快速排序 QuickSort

步骤:

  • 从数列中挑出一个元素作为基准数(这里我选择的是第一个数)
  • 将比基准数大的放到左边,小于或等于它的数都放到右边
  • 再对左右区间递归执行上一步,直至各区间只有一个数

代码如下:

1 #这里我用了递归和列表推到式(不明白列表推到式的可暂时跳过,后面讲到)
2 def QuickSort(l):
3     if len(l)<=1:
4         return l
5     return QuickSort([lt for lt in l[1:] if lt<l[0]]) + l[0:1] + QuickSort([ge for ge in l[1:] if ge>=l[0]])
6  
7 print(QuickSort([555,2,3,2,3,1,19,3.5,27,24]))   # [1, 2, 2, 3, 3, 3.5, 19, 24, 27, 555]

 

posted @ 2017-02-26 18:30  崔崔0624  阅读(259)  评论(0编辑  收藏  举报
TOP