初级排序算法
1. 选择排序
首先,找到数组中的最小的那个元素,其次,将它和数组的第一个元素交换位置;再次,在剩下的元素中找到最小的元素,将它与数组的第二的元素交换位置;如此往复,直到将整个数组排序。
import random
nums = [random.randint(1, 10000) for i in range(100)]
nums_len = len(nums)
for i in range(nums_len):
# 定义最小值的下标
least_index = i
for j in range(i + 1, nums_len):
# 如果下标为j的值比最小下标值小,则修改最小下标
if nums[j] < nums[least_index]:
least_index = j
# 将两个值交换
nums[i], nums[least_index] = nums[least_index], nums[i]
print(sort_list)
选择排序的特点:运行时间和输入无关,数据移动是最少的。
2. 插入排序
遍历整个数组,使左边的元素有序,索引到某个元素时,依次从左边有序数组的最右边开始移动和前一个元素比较,如果前一个元素比它大,则交换位置。
import random
nums = [random.randint(1, 10000) for i in range(100)]
nums_len = len(nums)
for i in range(nums_len):
# 从下标为j的元素往前遍历
for j in range(i, 0, -1):
# 如果后一个元素小于前一个元素,则交换位置
if nums[j] < nums[j - 1]:
nums[j], nums[j - 1] = nums[j - 1], nums[j]
# 如果后一个元素大于前一个元素,则已经有序,可不用再重复遍历
else:
break
print(sort_list)
3. 希尔排序
希尔排序是将数组中间隔h的元素先排序,再慢慢减小h值,直到h为1。是在插入排序的基础之上,优化的排序。
import random
nums = [random.randint(1, 10000) for i in range(1000)]
nums_len = len(nums)
# 设计h的取值
h = 1
while h < nums_len // 3:
h = 3 * h + 1
while h >= 1:
for i in range(h, nums_len):
# 以下为插入排序
for j in range(i, 0, -h):
if nums[j] < nums[j - h]:
nums[j], nums[j - h] = nums[j - h], nums[j]
else:
break
# h逐步减小直到1
h = int((h - 1) / 3)
print(nums)