由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 请问如何sort一个linked list?
相关主题
贡献一道G家的onsite题和简单面经(已悲剧)一个树,不一定是2叉树,让设计一个数据结构来serialize和 deserialize
很可能被这题搞挂了,sort linked list问道G家的面试题。
做了一下merge BSTG题,把binary tree里面的sibling节点连接起来
攒人品,Twitter 电面题目今天面的太惨了....
大家看看我写的这个itoa有没有bugsort list java solution
刚才重新回顾了一下那题MS on-site 面经&求分析(口头offer)
发几个面试题ms面试题目
几道F家面试题问个reverse linked list
相关话题的讨论汇总
话题: 160话题: sort话题: node话题: null话题: rh
进入JobHunting版参与讨论
1 (共1页)
p*****e
发帖数: 537
1
bubble sort应该是可以的,merge sort也是可行的只是比较麻烦。还有别的更好的方
法吗?
z*********8
发帖数: 2070
2
没了, 就写个merge sort吧
a**d
发帖数: 85
3
heap sort
u*****o
发帖数: 1224
4
只知道bubble sort怎么做,请问愿意分享merge sort怎么写吗?

【在 z*********8 的大作中提到】
: 没了, 就写个merge sort吧
p*****3
发帖数: 488
5
给个我以前写的吧,快速排序版本的
struct NODE
{
    int nVal;
    NODE* pNext;
 
    NODE(int n) : nVal(n), pNext(NULL) {}
};
 
void sort(NODE* pNode, int nLen)
{
    if (NULL == pNode || nLen <= 0)
        return;
 
    int nCount = 0;
    int nPivot = pNode->nVal;
    NODE* pPrev = pNode;
    NODE* pIterBeg = pPrev->pNext;
    NODE* pIterEnd = pIterBeg;
 
    while (NULL != pIterEnd)
    {
        if (pIterEnd->nVal < nPivot)
        {
            swap
(pIterBeg->nVal, pIterEnd->nVal);
            
pPrev = pPrev->pNext;
            
pIterBeg = pIterBeg->pNext;
            
nCount++;
        }
 
        pIterEnd = pIterEnd->pNext;
    }
 
    swap(pNode->nVal, pPrev->nVal);
 
    sort(pNode, nCount);
    sort(pIterBeg, nLen - 1 - nCount);
}
 
NODE* sortLinkedList(NODE* pHead)
{
    if (NULL == pHead)
        return NULL;
 
    int nLen = 0;
    NODE* pIter = pHead;
    while (pIter != NULL)
    {
        pIter = pIter->pNext;
        nLen++;
    }
 
    sort(pHead, nLen);
 
    return pHead;
}
d******e
发帖数: 164
6
void quick_sort(node *&head, node *&tail) {
if (!head) return;
node *lh, *lt, *rh, *rt;
lh = lt = rh = rt = NULL;
for (node *p = head->next; p; p = p->next) {
if (p->val < head->val) {
if (!lh) lh = lt = p;
else lt->next = p, lt = p;
} else {
if (!rh) rh = rt = p;
else rt->next = p, rt = p;
}
}
if (lh) lt->next = NULL;
if (rh) rt->next = NULL;
quick_sort(lh, lt);
quick_sort(rh, rt);
node *p = head;
p->next = NULL, tail = p;
if (lh) head = lh, lt->next = p;
if (rh) p->next = rh, tail = rt;
}

【在 p*****3 的大作中提到】
: 给个我以前写的吧,快速排序版本的
: struct NODE
: {
:     int nVal;
:     NODE* pNext;
:  
:     NODE(int n) : nVal(n), pNext(NULL) {}
: };
:  
: void sort(NODE* pNode, int nLen)

w**t
发帖数: 893
7
看看STL C++,有一个不错的实现

【在 u*****o 的大作中提到】
: 只知道bubble sort怎么做,请问愿意分享merge sort怎么写吗?
l********7
发帖数: 40
8
merge sort不复杂吧,都不用额外分配空间
x********u
发帖数: 1150
9
1. merge sort
no extra space needed. It is decided by the nature of linked list.
when merging two sorted sub lists, you can represent ordering by reassigning
node's next pointers. array elements don't have next pointers. so extra
array is needed to hold merged result. ordering in array is reflected by
array's indexes.
2. quick sort
copy linked list's node values into an array.
quick sort this array.
reassign linked list by copying values from the sorted array.
why this is a good approach? it can be faster than merge sort.
because it leverages cache's performance. CPU cache performs better on
adjacent numbers. array's numbers are adjacent in memory.
Numbers in linked list are rarely adjacent, they are scattered.
Also, quick sort has efficient inner loop. In most cases, it is faster than
merge sort.
performance gain from better cache hits + gain from using quick sort are set
back by the two copy operations.
z*********8
发帖数: 2070
m*****k
发帖数: 731
11
selection sort
c********p
发帖数: 1969
12
mark
1 (共1页)
进入JobHunting版参与讨论
相关主题
问个reverse linked list大家看看我写的这个itoa有没有bug
请教各位大牛一个K-way merge 的问题刚才重新回顾了一下那题
binary tree的in-order iterator怎么写?发几个面试题
FB面试题:binary tree inorder successor几道F家面试题
贡献一道G家的onsite题和简单面经(已悲剧)一个树,不一定是2叉树,让设计一个数据结构来serialize和 deserialize
很可能被这题搞挂了,sort linked list问道G家的面试题。
做了一下merge BSTG题,把binary tree里面的sibling节点连接起来
攒人品,Twitter 电面题目今天面的太惨了....
相关话题的讨论汇总
话题: 160话题: sort话题: node话题: null话题: rh