c语言双向链表 快速排序,双向链表的快速排序(swift版本)

面试经常会被问到的单向链表的快速排序or双向链表的快速排序,现在用swift写了一个双向链表的快速排序,直接上代码

获取源码

//初始化

var linkList = LinkList()

linkList.append(value: 12)

linkList.append(value: 5)

linkList.append(value: 30)

linkList.append(value: 3)

linkList.append(value: 3)

linkList.append(value: 2)

linkList.append(value: 9)

linkList.append(value: 4)

linkList.append(value: 11)

linkList.append(value: 19)

linkList.append(value: 15)

linkList.append(value: 16)

print("Init Data: \(linkList)")

var firstNode = linkList.searchIndex(index: 0)

var endNode = linkList.searchIndex(index: linkList.linkListSize() - 1)

quickSort(linkList: &linkList, low: &firstNode, high: &endNode)

print("After QuickSort: \(linkList)")

// Print效果

Init Data: [Optional(12), Optional(5), Optional(30), Optional(3), Optional(3), Optional(2), Optional(9), Optional(4), Optional(11), Optional(19), Optional(15), Optional(16)]

After QuickSort: [Optional(2), Optional(3), Optional(3), Optional(4), Optional(5), Optional(9), Optional(11), Optional(12), Optional(15), Optional(16), Optional(19), Optional(30)]

Program ended with exit code: 0

class Node {

var value: T

var next: Node?

weak var previous: Node?

init(value: T) {

self.value = value

}

}

class LinkList {

var head: Node?

var tail: Node?

// Add

func append(value: T) {

let newNode = Node.init(value: value)

if let tailNode = tail {

newNode.previous = tailNode

tailNode.next = newNode

}

else {

head = newNode

}

tail = newNode

}

// Size

func linkListSize() -> Int {

if let node = head {

var index = 1

var node = node.next

while node != nil {

index += 1

node = node?.next

}

return index

}

else {

return 0

}

}

// Search

func searchNode(indexNode: Node) -> Int {

if let node = head {

if node === indexNode {

return 0

}

else {

var index: Int = 0

var node = node.next

while node != nil {

index += 1

if node === indexNode {

return index

}

node = node?.next

}

// 不存在返回-1

return -1

}

}

else {

// 不存在返回-1

return -1

}

}

func lowBeforeHigh(low: Node, high: Node) -> Bool {

if low === high {

return false

}

else {

var node = low.next

while node != nil {

if node === high {

return true

}

node = node?.next

}

}

return false

}

func searchIndex(index: Int) -> Node? {

if let node = head {

if index == 0 {

return node

}

else {

var node = node.next

var nodeIndex: Int = 1

while node != nil {

if nodeIndex == index {

return node

}

nodeIndex += 1

node = node?.next

}

return nil

}

}

else {

return nil

}

}

// Remove

func remove(node: Node) -> T {

let preNode = node.previous

let nextNode = node.next

if let preNode = preNode {

// 前节点存在

preNode.next = nextNode

}

else {

// 不存在前节点,将nextNode置成head

head = nextNode

}

nextNode?.previous = preNode

if nextNode == nil {

tail = preNode

}

// 将node置成nil

node.previous = nil

node.next = nil

return node.value

}

func removeAll() {

head = nil

tail = nil

}

}

//MARK: - QuickSort

func quickSort(linkList: inout LinkList, low: inout Node?, high: inout Node?) {

guard linkList.head != nil && linkList.tail != nil else {

return

}

guard low != nil && high != nil else {

return

}

guard linkList.lowBeforeHigh(low: low!, high: high!) else {

return

}

let midIndex = partition(linkList: &linkList, low: &low!, high: &high!)

// 递归

quickSort(linkList: &linkList, low: &low, high: &linkList.searchIndex(index: midIndex )!.previous)

quickSort(linkList: &linkList, low: &linkList.searchIndex(index: midIndex)!.next, high: &high)

}

func partition(linkList: inout LinkList, low: inout Node, high: inout Node) -> Int {

var value: Int = 0

var lowNode = low

var highNode = high

let lowValue = low.value

while linkList.lowBeforeHigh(low: lowNode, high: highNode) {

// 从右边向左边扫描

while linkList.lowBeforeHigh(low: lowNode, high: highNode) && highNode.value >= lowValue {

highNode = highNode.previous!

}

if highNode === lowNode {

value = linkList.searchNode(indexNode: lowNode)

break

}

// lowNode和highNode交换值

let temp1Value = lowNode.value

lowNode.value = highNode.value

highNode.value = temp1Value

// 从左边向右边扫描

while linkList.lowBeforeHigh(low: lowNode, high: highNode) && lowNode.value <= lowValue {

lowNode = lowNode.next!

}

if lowNode === highNode {

value = linkList.searchNode(indexNode: lowNode)

break

}

// lowNode和highNode交换值

let temp2Value = lowNode.value

lowNode.value = highNode.value

highNode.value = temp2Value

}

return value

}

func swapTwoNode(low: inout Node, high: inout Node) {

// 相邻节点

if low.next === high {

low.previous?.next = high

high.previous = low.previous

low.previous = high

low.next = high.next

high.next?.previous = low

high.next = low

}

else {

// 非相邻节点

low.previous?.next = high

low.next?.previous = high

high.next?.previous = low

high.previous?.next = low

let temp1 = low.previous

low.previous = high.previous

high.previous = temp1

let temp2 = low.next

low.next = high.next

high.next = temp2

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值