javascript中實現一個鏈表的快速排序 ...
javascript中實現一個鏈表的快速排序
class Node {
constructor (value) {
this.val = value
this.next = undefined
}
}
class NodeList {
constructor (arr) {
let head = new Node(arr.shift())
let next = head
arr.forEach(item => {
next.next = new Node(item)
next = next.next
})
return head
}
}
let swap = (p, q) => {
let val = p.val
p.val = q.val
q.val = val
}
let partion = (begin, end) => {
let val = begin.val
let p = begin
let q = begin.next
while (q !== end) {
if (q.val < val) {
p = p.next
swap(p, q)
}
q = q.next
}
// 讓基準元素跑到中間去
swap(p, begin)
return p
}
export default function sort (begin, end) {
if (begin !== end) {
let part = partion(begin, end)
sort(begin, part)
sort(part.next, end)
}
}
export {
Node,
NodeList
}
測試文件
import sort, {
NodeList
} from '../../code/chain/lesson1'
test('sort:1', () => {
let head = new NodeList([4, 1, 3, 2, 7, 9, 10, 12, 6])
sort(head)
let res = []
let next = head
while (next) {
res.push(next.val)
next = next.next
}
expect(res).toEqual([1, 2, 3, 4, 6, 7, 9, 10, 12])
})