- 用Python 实现的九种排序算法
- 冒泡排序
- 直接插入排序
- 希尔排序
- 选择排序
- 堆排序
- 快速排序
- 归并排序
- 计数排序
- 基数排序
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这3.一点,最后的元素应该会是最大的数。
4.针对所有的元素重复以上的步骤,除了最后一个。
5.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
def bubble_sort(nums):
count = len(nums)
for i in range(0, count):
for j in range(i + 1, count):
if nums[i] > nums[j]:
nums[i],nums[j] = nums[j],nums[i]
可优化部分:设置一个flag,在某次循环未曾交换元素,则可以停止整个大循环
⒈ 从第一个元素开始,该元素可以认为已经被排序
⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 将新元素插入到下一位置中
⒍ 重复步骤2~5
def insert_sort(nums):
for i in range(1,len(nums)):
save = nums[i]
j = i
while j > 0 and nums[j - 1] > save:#找到新插入数据应处的位置
nums[j] = nums[j - 1]
j -= 1
nums[j] = save
先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。
def shell_sort(nums):
nums_len = len(nums)
gap = nums_len / 2 # 增量
while gap > 0:
for i in range(nums_len):
m = i
j = i + 1
while j < nums_len:
if nums[j] < nums[m]:
m = j
j += gap
if m != i:
nums[m],nums[i] =nums[i],nums[m]
gap /= 2
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在待序列的起始位置,直到全部待排序的数据元素排完。
def select_sort(nums):
for i in range(len(nums)):
min_index = i
for j in range(i + 1, len(nums)):
if nums[min_index] > nums[j]:
min_index = j
nums[i],nums[min_index] = nums[min_index],nums[i]
好麻烦
#数组编号 从0开始
def left(i):
return 2 * i + 1
def right(i):
return 2 * i + 2
#保持最大堆性质 是以i为根的子树成为最大堆
def max_heapify(nums, i ,heap_size):
if heap_size <= 0:
return
l = left(i)
r = right(i);
largest = i #选出子节点中较大的节点
if l < len(nums) and nums[l] > nums[largest]:
largest = l;
if r < len(nums) and nums[r] > nums[largest]:
largest = r
if i != largest: #说明当前节点不是最大的,下移
nums[i],nums[largest] = nums[largest],nums[i]
max_heapify(nums,largest,heap_size)
# 建堆
def build_max_heap(nums):
heap_size = len(nums)
if heap_size > 1 :
node = heap_size / 2 - 1
while node >= 0 :
max_heapify(nums, node, heap_size)
node -= 1
# 堆排序 下标从0开始,结果顺序为从大到小
def heap_sort(nums):
build_max_heap(nums)
heap_size = len(nums)
i = heap_size - 1
while i > 0:
nums[0],nums[i] = nums[i],nums[0] # 对中的最大值存入数组适当的位置,并且进行交换
heap_size -= 1 # heap 大小 递减1
i -= 1 # 存放堆中最大值的下标递减 1
max_heapify(nums,0,heap_size)
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
def quick_sort(nums,left,right):
if left >= right:
return
key = nums[left]
low = left
high = right
while left < right:
while left < right and nums[right] >= key:
right -= 1
nums[left] = nums[right]
while left < right and nums[left] <= key:
left += 1
nums[right] = nums[left]
nums[right] = key
quick_sort(nums,low,left - 1)
quick_sort(nums,left + 1, high)
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
def quick_sort(nums,left,right):
if left >= right:
return
key = nums[left]
low = left
high = right
while left < right:
while left < right and nums[right] >= key:
right -= 1
nums[left] = nums[right]
while left < right and nums[left] <= key:
left += 1
nums[right] = nums[left]
nums[right] = key
quick_sort(nums,low,left - 1)
quick_sort(nums,left + 1, high)
只能排正整数
import math
import sys
def count_sort(nums):
min = sys.maxint
max = 0
# 取得最大值和最小值
for x in nums:
if x > max:
max = x
if x < min:
min = x
# 创建数组C
count = [0] * (max - min +1)
for index in nums:
count[index - min] += 1
index = 0
# 填值
for a in range(max - min+1):
for c in range(count[a]):
nums[index] = a + min
index += 1
只能排正整数
import sys
import math
def radix_sort(a, radix=10):
"""a为整数列表, radix为基数"""
K = int(math.ceil(math.log(max(a), radix))) # 用K位数可表示任意整数
bucket = [[] for i in range(radix)] # 不能用 [[]]*radix
for i in range(1, K+1): # K次循环
for val in a:
bucket[val%(radix**i)/(radix**(i-1))].append(val) # 析取整数第K位数字 (从低到高)
del a[:]
for each in bucket:
a.extend(each) # 桶合并
bucket = [[] for i in range(radix)]