zoukankan      html  css  js  c++  java
  • python排序(冒泡、直接选择、直接插入等)

    冒泡排序

    冒泡法:第一趟:相邻的两数相比,大的往下沉。最后一个元素是最大的。

               第二趟:相邻的两数相比,大的往下沉。最后一个元素不用比。

     1 #冒泡排序
     2 array = [1,5,6,2,9,4,3]
     3 def bubble_sort(array):
     4     for i in range(len(array)-1):
     5         for j in range(len(array)-i-1):
     6             if array[j] > array[j+1]:
     7                 array[j],array[j+1] = array[j+1],array[j]
     8     return array
     9 
    10 bubble = bubble_sort(array)
    11 print(bubble)

    时间复杂度:O(n^2)

    稳定性:稳定

    改进:如果一趟比较没有发生位置变换,则认为排序完成

     1 array = [1,2,3,5,7]
     2 def bubble_sort(array):
     3     for i in range(len(array)-1):
     4         flag = 1   #建立标志位
     5         for j in range(len(array)-i-1):
     6             if array[j] > array[j+1]:
     7                 array[j],array[j+1] = array[j+1],array[j]
     8                 flag = 0
     9         if not flag:
    10             break
    11     return array
    12 
    13 bubble = bubble_sort(array)
    14 print(bubble)

    直接选择排序

    选择排序法:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放到序列的起始位置,直到全部排完。

     1 def select_sort(array):
     2     for i in range(len(array)-1):
     3         min = i
     4         for j in range(i+1, len(array)):
     5             if array[j] < array[min]:
     6                 min = j
     7         array[i], array[min] = array[min], array[i]
     8     return array
     9 
    10 array = [1,5,6,2,9,4,3]
    11 select = select_sort(array)
    12 print(select) 

    直接插入排序

    列表被分为有序区和无序区两个部分。最初有序区只有一个元素。
    每次从无序区选择一个元素,插入到有序区的位置,直到无序区变空。
    其实就相当于摸牌:

     1 def insert_sort(array):
     2     # 循环的是第二个到最后(待摸的牌)
     3     for i in range(1, len(array)):
     4         # 待插入的数(摸上来的牌)
     5         min = array[i]
     6         # 已排好序的最右边一个元素(手里的牌的最右边)
     7         j = i - 1
     8         # 一只和排好的牌比较,排好的牌的牌的索引必须大于等于0
     9         # 比较过程中,如果手里的比摸上来的大,
    10         while j >= 0 and array[j] < min:
    11             # 那么手里的牌往右边移动一位,就是把j付给j+1
    12             array[j+1] = array[j]
    13             # 换完以后在和下一张比较
    14             j -= 1
    15         # 找到了手里的牌比摸上来的牌小或等于的时候,就把摸上来的放到它右边
    16         else:array[j+1] = min
    17     return array
    18 
    19 list=[5,6,1,2,8,3,4]
    20 print(insert_sort(list))
  • 相关阅读:
    Project Euler 81:Path sum: two ways 路径和:两个方向
    Project Euler 80:Square root digital expansion 平方根数字展开
    Project Euler 79:Passcode derivation
    lintcode 中等题:Intersection of Two Linked Lists 两个链表的交叉
    lintcode 中等题:Divide Two Integers 两个数的除法
    lintcode 中等题 :Maximum Product Subarray 最大连续乘积子序列
    lintcode:First Missing Positive 丢失的第一个正整数
    山丘
    在山的那边
    lintcode :Ugly Numbers 丑数
  • 原文地址:https://www.cnblogs.com/pinpin/p/9862219.html
Copyright © 2011-2022 走看看