# 什么是sorting链接列表最快的algorithm？

### 11 Solutions collect form web for “什么是sorting链接列表最快的algorithm？”

Putty名声中的Simon Tatham解释了如何使用合并sorting对链表进行sorting 。 他总结了以下意见：

C中还有一个示例实现，可用于单向和双向链表。

Mergesort并行更好，所以如果这是你想要的，它可能是一个更好的select。 如果直接在链表上执行，速度也会更快。

—编辑

N = 1000：

N = 100000：

arrays与qsort：0.025000秒

N = 1000000：

arrays与qsort：0.420000秒

N = 100000000：

arrays与qsort：61.166000秒

` `#include <stdio.h> #include <stdint.h> #include <malloc.h> typedef struct _list list_t; struct _list { uint8_t value; list_t *next; }; list_t* sort_list ( list_t* list ) { list_t* heads[257] = {0}; list_t* tails[257] = {0}; // O(N) loop for ( list_t* it = list; it != 0; it = it -> next ) { list_t* next = it -> next; if ( heads[ it -> value ] == 0 ) { heads[ it -> value ] = it; } else { tails[ it -> value ] -> next = it; } tails[ it -> value ] = it; } list_t* result = 0; // constant time loop for ( size_t i = 255; i-- > 0; ) { if ( tails[i] ) { tails[i] -> next = result; result = heads[i]; } } return result; } list_t* make_list ( char* string ) { list_t head; for ( list_t* it = &head; *string; it = it -> next, ++string ) { it -> next = malloc ( sizeof ( list_t ) ); it -> next -> value = ( uint8_t ) * string; it -> next -> next = 0; } return head.next; } void free_list ( list_t* list ) { for ( list_t* it = list; it != 0; ) { list_t* next = it -> next; free ( it ); it = next; } } void print_list ( list_t* list ) { printf ( "[ " ); if ( list ) { printf ( "%c", list -> value ); for ( list_t* it = list -> next; it != 0; it = it -> next ) printf ( ", %c", it -> value ); } printf ( " ]\n" ); } int main ( int nargs, char** args ) { list_t* list = make_list ( nargs > 1 ? args[1] : "wibble" ); print_list ( list ); list_t* sorted = sort_list ( list ); print_list ( sorted ); free_list ( list ); }` `

Mergesort是你可以在这里做的最好的。

（更新如下，评论者在这里描述一个很好的观点）

algorithm的要点是：

` ` while list not empty accumulate a run from the start of the list merge the run with a stack of merges that simulate mergesort's recursion merge all remaining items on the stack` `

` ` int i = 0; for ( ; i < stack.size(); ++i) { if (!stack[i]) break; run = merge(run, stack[i], comp); stack[i] = nullptr; } if (i < stack.size()) { stack[i] = run; } else { stack.push_back(run); }` `

` ` [ ] [ (d) ] [ () (ad) ] [ (g), (ad) ] [ () () (adgi) ] [ (b) () (adgi) ] [ () (be) (adgi) ] [ (c) (be) (adgi ) ] [ () () () (abcdefgi) ] [ (j) () () (abcdefgi) ] [ () (hj) () (abcdefgi) ]` `

（嗯…第二次更新。）

• 根据第二个参数sorting元组
• 组成两个比较函数？
• 如何将“参数”对象转换为JavaScript中的数组？
• Java中的sorting集合
• sortingC ++string的字符
• 如何sortingJava中的对象数组？
• Endianness是什么时候成为一个因素？
• 最快的方法来sorting在JavaScript中的32位有符号整数数组？
• pandas群体在小组内sorting
• 当我们讨论分类时，什么是自然顺序？
• 在OrderBy中使用LINQ自定义sorting逻辑