使用 merge sort/quick sort 对 Python 中 class 个对象的属性进行排序

Using merge sort/quick sort to sort attribute of class objects in Python

我有这个学生class

class Student:
    def __init__(self, name, id):
        self.name = name
        self.id = id

我需要对 Student class 的一些对象进行排序,特别是使用 merge/quick 排序 id 和预期结果进行排序是学生姓名的数组。所以如果我有这些对象:

s1 = Student("Andy", 4)
s2 = Student("Bob", 3)
s3 = Student("Sophie", 2)
s4 = Student("Tony", 1)
s5 = Student("Jerry", 5)

预期结果:

result = ["Tony", "Sophie", "Bob", "Andy", "Jerry"]

我不确定是否需要创建对象数组或放置排序函数的位置。

有什么想法吗?

将其转换成对数组,然后应用合并排序并将数组作为参数传递

def merge(arr, l, m, r): n1 = m - l + 1 n2 = r- m

# create temp arrays 
L = [0] * (n1) 
R = [0] * (n2) 

# Copy data to temp arrays L[] and R[] 
for i in range(0 , n1): 
    L[i] = arr[l + i] 

for j in range(0 , n2): 
    R[j] = arr[m + 1 + j] 

# Merge the temp arrays back into arr[l..r] 
i = 0    # Initial index of first subarray 
j = 0    # Initial index of second subarray 
k = l    # Initial index of merged subarray 
enter code here

while i < n1 and j < n2 : 
    if L[i][1] <= R[j][1]: // here you need to compare id
        arr[k] = L[i] 
        i += 1
    else: 
        arr[k] = R[j] 
        j += 1
    k += 1
# Copy the remaining elements of L[], if there 
# are any 
while i < n1: 
    arr[k] = L[i] 
    i += 1
    k += 1
# Copy the remaining elements of R[], if there 
# are any 
while j < n2: 
    arr[k] = R[j] 
    j += 1
    k += 1

def mergeSort(arr,l,r): 
      if l < r: 
        # Same as (l+r)//2, but avoids overflow for 
        # large l and h 
        m = (l+(r-1))//2
        # Sort first and second halves 
        mergeSort(arr, l, m) 
        mergeSort(arr, m+1, r) 
        merge(arr, l, m, r) 

arr = [( "sdas",1), ( "asd3",3), ( "asd1",2)] 
n = len(arr) 
print ("Given array is") 
for i in range(n): 
    print ("%s" %arr[i][0]), 

mergeSort(arr,0,n-1) 
print ("\n\nSorted array is") 
for i in range(n): 
    print (arr[i]), 
#or you can use predefined sort function like this
def sortSecond(val): 
    return val[1] 
arr = [( "sdas",1), ( "asd3",3), ( "asd1",2)] 
# sorts the array in ascending according to 
# second element 
arr.sort(key = sortSecond) 
print(arr) 

您可以使用 is 创建学生列表。 假设你将自己编写归并排序函数,现在你有一个这样的函数定义:

def merge_sort(students_array)

现在应该以特定方式实现此功能,您可以根据 id 比较元素。

为此,您有几种选择:

  1. 有一个__eq__(函数支持a == b),__le__(函数支持a <= b),__ge__(函数支持a >= b ), __gt__ (函数支持a > b), __lt__ (函数支持a < b)。您可以只使用“<、>、=”IMO,但这些是您要考虑的功能。 Student 需要实现它们,然后可以通过比较他们的 ID 来比较两个学生 - 这可能是最 pythonic 的方法:

示例实现:

class Student:
    def __init__(self, name, id):
        self.name = name
        self.id = id
    def __eq__(self, other):
        return self.id == other.id

    def __gt__(self, other):
        return self.id > other.id

    def __lt__(self, other):
        return self.id < other.id

...
# getting a list of Students, not only ids
def merge_sort(students_array):
...
    # example compare in the sort function
    # this will be translated to: students_array[i].__gt__(students_array[j])
    # which will return: students_array[i] > students_array[j]
    if students_array[i] > students_array[j]:
        # do something
...

def main():

    s1 = Student("Andy", 4)
    s2 = Student("Bob", 3)
    s3 = Student("Sophie", 2)
    s4 = Student("Tony", 1)
    s5 = Student("Jerry", 5)
    students_array = [s1, s2, s3, s4, s5]
    merge_sort(students_array)

关于 python dunder 函数的良好文档: https://docs.python.org/3/library/operator.html

希望有所帮助