【发布时间】:2021-12-15 19:30:46
【问题描述】:
使用快速排序对链表进行排序的最简洁方法是什么?我目前有以下,但不是很好。我正在使用诸如 sort(self) 之类的函数,因此我可以简单地使用 list.sort() 并且我会通过快速排序方法对我的链表进行排序。
可能的方法但不知道如何实现:从当前列表(self)开始,让pivot为列表头部的数据,并创建两个新的链表:一个称为smaller(包含其数据的所有元素小于枢轴)和另一个(包含所有剩余元素,除了枢轴)。然后,调用smaller.sort()和other.sort(),将当前列表设置为更小,然后追加pivot并与other合并。
如果有人有任何想法......
# Node of LinkedList
class Node :
def __init__(self, data) :
# set node value
self.data = data
self.next = None
class MyLinkedList :
# Class constructors
def __init__(self) :
self.head = None
self.tail = None
# insert node at last of linke list
def insert(self, value) :
# Create a node
node = Node(value)
if (self.head == None) :
# When linked list empty add first node
self.head = node
self.tail = node
else :
# Add new node at end of linked list
self.tail.next = node
self.tail = node
# Display linked list nodes
def display(self) :
if (self.head != None) :
print("\n Linked List :", end = "")
temp = self.head
while (temp != None) :
print(" ", temp.data, end = "")
temp = temp.next
if (temp == self.head) :
# avoid loop
return
else :
print("Empty Linked List", end = "")
# Find last node of linked list
def last_node(self) :
temp = self.head
while (temp != None and temp.next != None) :
temp = temp.next
return temp
# Set of given last node position to its proper position
def parition(self, first, last) :
# Get first node of given linked list
pivot = first
front = first
temp = 0
while (front != None and front != last) :
if (front.data < last.data) :
pivot = first
# Swap node value
temp = first.data
first.data = front.data
front.data = temp
# Visit to next node
first = first.next
# Visit to next node
front = front.next
# Change last node value to current node
temp = first.data
first.data = last.data
last.data = temp
return pivot
# Perform quick sort in given linked list
def quick_sort(self, first, last) :
if (first == last) :
return
# Find pivot node
pivot = self.parition(first, last)
if (pivot != None and pivot.next != None) :
self.quick_sort(pivot.next, last)
if (pivot != None and first != pivot) :
self.quick_sort(first, pivot)
def main() :
obj = MyLinkedList()
# Create linked list
obj.insert(41)
obj.insert(5)
obj.insert(7)
obj.insert(22)
obj.insert(28)
obj.insert(63)
obj.insert(4)
obj.insert(8)
obj.insert(2)
obj.insert(11)
print("\n Before Sort ", end = "")
obj.display()
obj.quick_sort(obj.head, obj.last_node())
print("\n After Sort ", end = "")
obj.display()
if __name__ == "__main__": main()
【问题讨论】:
-
“我没有节点类、链表类等”:你的第一个代码块有它们。那么你想要什么:是否有类的解决方案?如果您只包括一次尝试,并准确指出它的问题所在,那就太好了。目前你的问题“任何想法”太宽泛了。
-
简单看一下我目前的快速排序,不难看出效率不高,感觉还可以改进。没有类的提及是指不同的代码(我已删除以避免混淆)并且原始帖子已被更正。 ~~~~ 我是否应该将其作为一种解决方法:将数据值放入数组中,使用快速排序对数组进行排序,然后将所有内容追加回链表?
-
如果您的代码有效,并且您要求在效率(或最佳实践等)方面进行审查,那么这个问题更适合CodeReview
标签: python list sorting linked-list quicksort