冒泡排序
冒泡排序的时间复杂度是O(N2)
冒泡排序的思想: 每次比较两个相邻的元素, 如果他们的顺序错误就把他们交换位置
def bubbleSort(n):
for j in range(len(nums)-1): # 这个循环负责设置冒泡排序进行的次数,同时后面程序取用j的值
for i in range(len(nums)-j-1): # j为列表下标
if nums[i] > nums[i+1]:
nums[i], nums[i+1] = nums[i+1], nums[i]
return nums
nums = [5,2,45,6,8,2,1]
print bubbleSort(nums)
优缺点: 冒泡排序解决了桶排序浪费空间的问题, 但是冒泡排序的效率特别低
插入排序
每次将一个待排序的数据,跟前面已经有序的序列的数字一一比较找到自己合适的位置,插入到序列中,直到全部数据插入完成。
def insertSort(nums):
for i in range(len(nums)):
position = i
while position>0:
if nums[position-1]>nums[position]:
nums[position-1], nums[position] = nums[position], nums[position-1]
position -= 1
return nums
nums = [8,4,5,7,2,5,1]
print insertSort(nums)
选择排序
选择排序每次只记录最大数的索引值. 类似于冒泡排序, 也是要比较n-1次, 区别是冒泡排序每次都交换, 选择排序只在最后比较完后才进行交换
def selectSort(nums):
for i in range(len(nums)):
max_index = 0
for j in range(len(nums)-i):
if nums[max_index] < nums[j]:
max_index = j
nums[max_index], nums[len(nums)-i-1] = nums[len(nums)-i-1], nums[max_index]
return nums
nums = [6,2,54435,3141]
print selectSort(nums)
桶排序
桶排序非常浪费空间, 比如需要排序的范围在0~2000之间, 需要排序的数是[3,9,4,1000], 同样需要1001个空间
注意: 桶排序不能排序小数
def bucketSort(nums):
# 选择一个最大的数
max_num = max(nums)
# 创建一个元素全是0的列表, 当做桶
bucket = [0]*(max_num+1)
# 把所有元素放入桶中, 即把对应元素个数加一
for i in nums:
bucket[i] += 1
# 存储排序好的元素
sort_nums = []
# 取出桶中的元素
for j in range(len(bucket)):
if bucket[j] != 0:
for y in range(bucket[j]):
sort_nums.append(j)
return sort_nums
nums = [5,6,3,2,1,65,2,0,8,0]
print bucketSort(nums)