两种产生随机数列的方法
import numpy as np
a=np.random.randint(1,100,10)
a=np.arange(10)
a=10-np.arange(10)
print(a)
import random as rd
a=[rd.randrange(1,100) for i in range(10]
a=list(range(10))
a=list(range(9,-1,-1)
print(a)
冒泡排序的基本思想是通过比较相邻元素,将待排序区域的最小或最大值交换到左端(或右端)。
通常它要用到一个二重循环,外层循环累计排序轮数,同时控制待排序数组的右边界,
即a[0..i]为待排序部分;内层循环扫描a[0..i-1],比较相邻元素,并通过交换元素值
的方式将最大值冒泡到最右端。
由于外层循环变量i的含义既可以表示排序轮数,也可以表示待排序数组的边界,
内层循环扫描方向既可以向左,也可以向右,所以实现基础冒泡排序的代码形式多样,
可以产生很多变例。
外层循环累计排序轮数,同时控制待排序数组的右边界,即a[0..i]为待排序部分;
内层循环扫描a[0..i-1],比较相邻元素,并通过交换元素值的方式将最大值冒泡到
向右扫描,将最大值冒泡到右端
i表示外循环次数,还表示已排数
for i in range(1,len(a)):
for j in range(len(a)-i):
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
print(i,j,a)
向左扫描,将最小值冒泡到左端
for i in range(1,len(a)):
for j in range(len(a)-i,i-1,-1):
if a[j] < a[j-1]:
a[j], a[j-1] = a[j-1], a[j]
print(i,j,a)
最右端
for i in range(len(a)-1, 0, -1):
for j in range(i):
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
print(i,j,a)
设置交换操作标志
for i in range(len(a)-1, 0, -1):
swapFlag = False
for j in range(i):
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
swapFlag = True
print(i,j,a)
if not swapFlag: break #无交换操作,表示已完成排序,退出循环
更新右边界,减少扫描范围
left, right = 0, len(a)-1
while left < right:
swapPos = left
for j in range(left,right):
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
swapPos = j
print(left,right,a)
right = swapPos #修改待排序数组的右边界
更新左右边界,减 少扫描范围
双向冒泡(鸡尾酒排序),又称快乐排序
left, right = 0, len(a)-1
while left < right:
swapPos = left #先假设最后一次发生交换操作的位置为left
for j in range(left,right): #顺序扫描a[left..right-1]
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
swapPos = j
print(a)
right = swapPos #修改待排序数组的右边界
for j in range(right,left,-1): #逆序扫描a[left+1..right]
if a[j] < a[j-1]:
a[j],a[j-1] = a[j-1],a[j]
swapPos = j
print(a)
left = swapPos #修改待排序数组的左边界
print(a)