自己写的,排序之后比较,也是最慢的一种方法
class Solution:
def heightChecker(self, heights: List[int]) -> int:
s=0
he1 = heights.copy()
for i in range(len(heights)):
for j in range(i+1,len(heights)):
if heights[i]>heights[j]:
heights[i],heights[j] = heights[j],heights[i]
for i in range(len(heights)):
if heights[i]!=he1[i]:
s=s+1
return s
注意有个点, he1 = heights.copy()
如果少了copy()就是引用赋值了。
改进后:
class Solution:
def heightChecker(self, heights: List[int]) -> int:
res = sorted(heights)#该函数生成一个新的序列,不改变原序列
count = 0
for i in range(len(heights)):
if res[i] != heights[i]:
count += 1
return count
有关【sort】函数:
内部实现机制为:Timesort
Timsort是结合了合并排序(merge sort)和插入排序(insertion sort)而得出的排序算法,它在现实中有很好的效率。
最坏时间复杂度为:O(n log n)
空间复杂度为:O(n)
参考:https://www.cnblogs.com/clement-jiao/p/9243066.html
基数排序(桶排序)
其实和上面改进后的sort差距并不大
class Solution:
def heightChecker(self, heights: List[int]) -> int:
d = [0] * 101
ans = j = 0
for i in heights:
d[i] += 1
for i in range(1, 101):
while d[i]:
if heights[j] != i:
ans += 1
j += 1
d[i] -= 1
return ans
再贴个代码,学习基数排序时候敲的
import random
def inputarr(data,size):
for i in range(size):
data[i]=random.randint(0,990)
def showdata(data, size):
for i in range(size):
print('%5d'%data[i],end='')
print()
def radix(data, size):
n=1
while n<=100:
tmp = [[0]*100 for row in range(10)]
for i in range(size):
m = (data[i]//n)%10
tmp[m][i] = data[i]
k=0
for i in range(10):
for j in range(size):
if tmp[i][j]!=0:
data[k]=tmp[i][j]
k+=1
print('经过%3d位数排序后:'%n,end='')
showdata(data,size)
n=10*n
def main():
data = [0]*100
size = int(input('请输入数列的大小(100以下):'))
print('原始数据是:')
inputarr(data,size)
showdata(data,size)
radix(data,size)
main()
运行结果: