python 排序算法

一、冒泡排序

两层for循环,内循环比较当前数与下一位的大小,如小,交换位置。

1 def bubble_sort(data):
2     for i in range(len(data)-1):
3         for j in range(len(data)- i -1):
4             if data[j]<data[j + 1]:
5                 data[j], data[j + 1] = data[j + 1], data[j]

 

二、插入排序

循环有序数列后的每一位数,如果大于有序数列的最后一位,则两数交换位置,再与有序数列的最后第二位比较,以此类推。

1 def insect_sort(data):
2     for i in range(1, len(data)):
3         tmp = data[i]
4         j = i - 1
5         while j>=0 and data[j] > tmp:
6             data[j],data[j + 1] = data[j + 1],data[j]
7             j -= 1
8         data[j + 1] = tmp

 

三、选择排序

每次for循环都找出最小的数,作为该次循环的结果

1 def select_sort(data):
2     for i in range(len(data)-1):
3         min_num = i
4         for j in range(i+1, len(data)):
5             if data[j]<data[i]:
6                 min_num = j
7             data[i], data[min_num] = data[min_num], data[i]

 

四、快排

选第一个数,从左开始循环比较,如小于,停止循环,将小的数放至第一个数位置,从右开始循环,如大于,停止循环,将大的数放到上次循环空位上,如此循环直到left = right,返回mid,进行递归

 1 def quick_sort(data,left,right):
 2     if left<right:
 3         mid = partition(data,left,right):
 4         quick_sort(data,left,mid-1)
 5         quick_sort(data,mid+1,right)
 6 
 7 def partition(data,left,right):
 8     tmp = data[left]
 9     while left < right:
10         while left < right and data[right]>=tmp:
11             right -= 1
12         data[left] = data[right]
13         while left < right and data[left]<=tmp:
14             left += 1
15         data[right] = data [left]
16     data[left] = tmp
17     return left

 

五、堆排序

先从最小的有子节点的父节点开始循环调整建堆,然后取数,将堆末与堆顶换位,再进行一次除开已换下位的堆顶的调整,如此循环。

def sift(data,low,high):
    i = low
    j = 2*i + 1
    tmp = data[i]
    while j <= high:  # 只要没到最后根最后
        if j < high and data[j] < data[j + 1]:  # 是否有右孩子,且右孩子大于左孩子
            j = j + 1  # j 成为最大孩子的下标
        if tmp < data[j]:  # 最大的孩子是否大于父亲
            data[i] = data[j]  # 子孩子上位
            i = j  # 重新赋值下标
            j = 2*i + 1
        else:  # 上述条件都不满足,跳出循环
            break
    data[i] = tmp

def heap_sort(data):
    n = len(data)
    for i in range(n // 2 -1 ,-1,-1):
        sift(data,i,n-1)
    for i in range(n-1,-1,-1):
        data[0],data[i] = data[i],data[0]
        sift(data,0,i-1)

 

posted @ 2017-10-14 15:58  有虫子啊  阅读(298)  评论(2编辑  收藏  举报