您的位置:首页 > 编程语言 > Python开发

Python实现常用排序算法总结

2017-05-25 11:29 525 查看


一、概述

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






当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-8

def 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+
4000
1], lists[j]
return lists
lists = [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)



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: