面试官:请实现一个排序算法,要求时间复杂度为O(N)
面试官:我们想对公司所有员工按年龄排序,我们公司共有几万名员工;
面试官:只允许使用常量大小的辅助空间,不得超过O(N);
法一:创建类实现学生的名字,年龄,性别属性,并可以按照某种属性来排序。也可以用字典,但是好像不直观,暂时不写。采用冒泡排序,这是基础中的基础。
import random
import string
class Student:
def __init__(self,name,gender,age):
self._name = name
self._gender = gender
self._age = age
def get_age(self):
return self._age
def print_student(self):
return self._name,self._gender,self._age
# def __str__(self):
# return '%s%s%s'%(self._name,self._gender,self._age)
# __repr__ = __str__##联合上面两个式子可以显示出具体值而不是对象的地址!!!!!!!!
def generate_student_name(num):
list = []
for i in range(num):
randname = ''.join(random.sample(string.ascii_letters,4))
randgender = random.choice(['male','female'])
randage = random.randint(10,40)
s = Student(randname,randgender,randage)
list.append(s)
return list
def sort_student(list):
for i in range(len(list)):
for j in range(1,len(list)-1):
if list[j].get_age()<list[j-1].get_age():
list[j],list[j-1] = list[j-1],list[j]
return list
if __name__ == '__main__':
name = generate_student_name(3)
sort = sort_student(name)
for x in sort:
print(x.print_student())
#如果不用上面两行,也可以用上面对类内置方法进行定义也可以直接显示出要求显示的名字属性,
#不过由于返回的是一个类(注意是类)但显示的是名字,
#所以要进行比较还是要for x in sort:print(x.print_student())
法二:
用python自带的函数sorted也行:
sort = sorted(name,key=lambda Student:Student.get_age())
通过匿名函数指定属性排序。
这里可以这样理解,就是通过匿名函数把[student对象1,student对象2,student对象3…]返回其年龄属性,所以就变成了[student对象1的年龄,student对象2的年龄,student对象3的年龄…],再进行排序。所以sort也可以改成**sort = sorted(name,key=lambda x:x.get_age())**因为x只是输入的变量,是name一个元素的代表,叫什么都可以,就算是类student
用字典方法:
import random
import string
def generate_student_name(num):
list = []
for i in range(num):
randname = ''.join(random.sample(string.ascii_letters,4))
randgender = random.choice(['male','female'])
randage = random.randint(10,40)
s = {'randname':randname,'randgender':randgender,'randage':randage}
list.append(s)
return list
if __name__ == '__main__':
name = generate_student_name(3)
# sort = sorted(name,key=lambda s:s['randage'])结果是一样的
sort = sorted(name,key=lambda x:x['randage'])
for x in sort:
print(x)