python 实现排序算法

一、冒泡排序

原理:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。

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

二、插入排序

原理:有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序。

def insert_sort(data):
  for i in range(1, len(data)):
    tmp = data[i]
    j = i - 1
    while j>=0 and data[j] > tmp:
      data[j],data[j + 1] = data[j + 1],data[j]
      j -= 1
    data[j + 1] = tmp

三、选择排序

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

def select_sort(data):
  for i in range(len(data)-1):
    min_num = i
    for j in range(i+1, len(data)):
      if data[j]<data[i]:
        min_num = j
      data[i], data[min_num] = data[min_num], data[i]

四、快速排序

原理:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

def quick_sort(data,left,right):
  if left<right:
    mid = partition(data,left,right):
    quick_sort(data,left,mid-1)
    quick_sort(data,mid+1,right)

def partition(data,left,right):
  tmp = data[left]
  while left < right:
    while left < right and data[right]>=tmp:
      right -= 1
    data[left] = data[right]
    while left < right and data[left]<=tmp:
      left += 1
    data[right] = data [left]
  data[left] = tmp
  return left


五、堆排序

原理:堆积排序(Heapsort)是指利用堆积树(堆)这种资料结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。

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 on 2017-12-17 20:38  niansi  阅读(182)  评论(0编辑  收藏  举报

导航