Python实现常用排序算法总结

来源:互联网 发布:mac上编写c语言的软件 编辑:程序博客网 时间:2024/06/13 12:04

一、概述

排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。


当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。

快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;


二、算法实现

1. 交换排序之冒泡排序(Bubble Sort)

冒泡排序的时间复杂度是O(N^2)
冒泡排序的思想: 每次比较两个相邻的元素, 如果他们的顺序错误就把他们交换位置
冒泡排序原理: 每一趟只能将一个数归位, 如果有n个数进行排序,只需将n-1个数归位, 也就是说要进行n-1趟操作(已经归位的数不用再比较)
比如有五个数: 12, 35, 99, 18, 76, 从大到小排序, 对相邻的两位进行比较
第一趟:
第一次比较: 35, 12, 99, 18, 76
第二次比较: 35, 99, 12, 18, 76
第三次比较: 35, 99, 18, 12, 76
第四次比较: 35, 99, 18, 76, 12
经过第一趟比较后, 五个数中最小的数已经在最后面了, 接下来只比较前四个数, 依次类推
第二趟
99, 35, 76, 18, 12
第三趟
99, 76, 35, 18, 12
第四趟
99, 76, 35, 18, 12
比较完成

#!/usr/bin/env python# coding:utf-8def bubbleSort(lists):    count=len(lists)    for i in range(count-1):    # 这个循环负责设置冒泡排序进行的次数        for j in range(count-i-1):  # j为列表下标            if lists[j] > lists[j+1]:                lists[j], lists[j+1] = lists[j+1], lists[j]    return listslists = [43,19,28,38,56,73,99,49,66]print (bubbleSort(lists))


2.交换排序之快速排序(Quick Sort)

基本思想:

1)选择一个基准元素,通常选择第一个元素或者最后一个元素,

2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。

3)此时基准元素在其排好序后的正确位置

4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。


lists=[55,46,37,99,16,81,73,61,19,49]def quick_sort(lists, left, right):      # 快速排序      if left >= right:          return lists    key = lists[left]      low = left      high = right      while left < right:          while left < right and lists[right] >= key:              right -= 1          lists[left] = lists[right]          while left < right and lists[left] <= key:              left += 1          lists[right] = lists[left]      lists[right] = key      quick_sort(lists, low, left - 1)      quick_sort(lists, left + 1, high)      return lists  print quick_sort(lists, left=0, right=len(lists)-1)

3.归并排序(merge sort)
基本思想:
归并排序是一种典型的分治思想,把一个无序列表一分为二,对每个子序列再一分为二,继续下去,直到无法再进行划分为止。然后,就开始合并的过程,对每个子序列和另外一个子序列的元素进行比较,依次把小元素放入结果序列中进行合并,最终完成归并排序。

lists = [43,19,28,38,56,73,99,49,66] def merge(left, right):      i, j = 0, 0      result = []      while i < len(left) and j < len(right):          if left[i] <= right[j]:              result.append(left[i])              i += 1          else:              result.append(right[j])              j += 1      result += left[i:]      result += right[j:]      return result     def merge_sort(lists):      # 归并排序      if len(lists) <= 1:          return lists      num = len(lists) / 2      left = merge_sort(lists[:num])      right = merge_sort(lists[num:])      return merge(left, right) print merge_sort(lists)

4.插入排序之直接插入排序(Straight Insertion Sort)


原创粉丝点击