Python是人工智能时代最佳的编程语言,也是科学运算、机器学习的主流语言。一个高薪Python工程师相较于普通Python程序员所具备的优势不仅是扎实的理论和丰富的项目经验,更包含其对算法的掌握。接下来的杭州Python学习进阶课程小编就给大家分享常见的Python排序算法。

冒泡排序BubbleSort
冒泡排序的原理非常简单,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
具体步骤如下:
1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2)对第0个到第n-1个数据做同样的工作。这时,最大的数就“浮”到了数组最后的位置上。
3)针对所有的元素重复以上的步骤,除了最后一个。
4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
参考代码:
def bubble_sort2(ary):
n = len(ary)
for i in range(n):
flag = True # 标记
for j in range(1, n - i):
if ary[j] < ary[j-1]:
ary[j], ary[j-1] = ary[j-1], ary[j]
flag = False

某一趟遍历如果没有数据交换,则说明已经排好序了,因此不用再进行迭代了

if flag:    
        break
return ary

2、选择排序SelectionSort
选择排序是另一个很容易理解和实现的简单排序算法。具体步骤:
1)在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
2)再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
3)以此类推,直到所有元素均排序完毕。
参考代码:
def select_sort(ary):
n = len(ary)
for i in range(0,n):
min = i #最小元素下标标记
for j in range(i+1,n):
if ary[j] < ary[min] :
min = j #找到最小值的下标
ary[min],ary[i] = ary[i],ary[min] #交换两者
return ary

3、插入排序 InsertionSort
插入排序的工作原理是,对于每个未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
具体步骤:
1)从第一个元素开始,该元素可以认为已经被排序。
2)取出下一个元素,在已经排序的元素序列中从后向前扫描。
3)如果被扫描的元素(已排序)大于新元素,将该元素后移一位。
4)重复步骤3,直到找到已排序的元素小于或者等于新元素的位置。
5)将新元素插入到该位置。
6)重复步骤2-5。
参考代码:

插入排序

def insert_sort(ary):
count = len(ary)
for i in range(1, count):
key = i - 1
mark = ary[i] # 注: 必须将ary[i]赋值为mark,不能直接用ary[i]
while key >= 0 and ary[key] > mark:
ary[key+1] = ary[key]
key -= 1
ary[key+1] = mark
return ary

4、希尔排序 ShellSort
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序。
参考代码:
def shell_sort(ary):
count = len(ary)
gap = round(count / 2)

双杠用于整除(向下取整),在python直接用 “/” 得到的永远是浮点数,

# 用round()得到四舍五入值
while gap >= 1:
    for i in range(gap, count):
        temp = ary[i]
        j = i
        while j - gap >= 0 and ary[j - gap] > temp:  # 到这里与插入排序一样了
            ary[j] = ary[j - gap]
            j -= gap
        ary[j] = temp
    gap = round(gap / 2)

return ary

5、归并排序MergeSort

归并排序是建立在归并操作上的一种有效的排序算法。该算法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
参考代码:

归并排序

def merge_sort(ary):

    if len(ary) <= 1:
        return ary

    median = int(len(ary)/2)    # 二分分解
    left = merge_sort(ary[:median])
    right = merge_sort(ary[median:])
    return merge(left, right)    # 合并数组

def merge(left, right):
 '''合并操作,
将两个有序数组left[]和right[]合并成一个大的有序数组'''
    res = []
    i = j = k = 0
    while(i < len(left) and j < len(right)):
        if left[i] < right[j]:
            res.append(left[i])
            i += 1
        else:
            res.append(right[j])
            j += 1

    res = res + left[i:] + right[j:]
    return res

6、快速排序 QuickSort
快速排序通常明显比同为Ο(n log n)的其他算法更快,因此常被采用,而且快排采用了分治法的思想,所以在很多笔试面试中能经常看到快排的影子。可见掌握快排的重要性。
具体步骤:
1)从数列中挑出一个元素作为基准数。

2)分区过程,将比基准数大的放到右边,小于或等于它的数都放到左边。
3)再对左右区间递归执行第二步,直至各区间只有一个数。
参考代码:
def quick_sort(ary):
return qsort(ary, 0, len(ary) - 1)
def qsort(ary, start, end):
if start < end:
left = start
right = end
key = ary[start]
else:
return ary
while left < right:
while left < right and ary[right] >= key:
right -= 1
if left < right: # 说明打破while循环的原因是ary[right] <= key
ary[left] = ary[right]
left += 1
while left < right and ary[left] < key:
left += 1
if left < right: # 说明打破while循环的原因是ary[left] >= key
ary[right] = ary[left]
right -= 1
ary[left] = key # 此时,left=right,用key来填坑

qsort(ary, start, left - 1)

qsort(ary, left + 1, end)
return ary

除此之外,常用的算法还包括堆排序、基数排序等,在此小编就不多做赘述。