由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 两行quicksort,不难些吧
相关主题
我也来一个, quick sort 只要一行。请教一个初级算法问题 (转载)
我写的quick sort算法之极弱问
underlying sort algorithm for SET in STL?问一个严肃的实用问题
靠。Sedgewick这3w-qsort算法居然还有bug!哪位大侠给说说 何时用 merge sort, 何时用 quick sort, 何时
嵌入式系统用什么sorting算法比较好?包子问使用C templates Sort data的问题
nv的显卡能战胜intel的CPU么Is it safe to use unique_ptr with STL container?
大家看看这个简单的qsort排序的问题Leetcode上面的"Search in rotated sorted array II"
一个C的void指针的问题大家有没有觉得Scala不如Haskell美?
相关话题的讨论汇总
话题: qsort话题: xs话题: void话题: pivot话题: int
进入Programming版参与讨论
1 (共1页)
n**********2
发帖数: 648
1
qsort [] = []
qsort (x:xs) = qsort (filter (<= x) xs) ++ [x] ++ qsort (filter (> x) xs)
n*w
发帖数: 3393
2
F#:
let rec qsort = function
| [] -> []
| x::xs -> let smaller,larger = List.partition (fun y -> y<=x) xs
qsort smaller @ [x] @ qsort larger
b*****t
发帖数: 840
3
好写好懂,
但pivot选的真心别扭
这比java估计慢二十倍以上
你写个性能好的haskell qsort绝壁比java难懂二十倍
语法糖没意思,haskell玩玩还可以,但绝壁不是industrial grade语言
n*w
发帖数: 3393
4
C#:
public static IEnumerable QSLinq(IEnumerable items)
{
if (items.Count() <= 1) return items;
var pivot = items.First();
return QSLinq(item.Where(i=>i .Concat(QSLinq(item.Where(i=>i==pivot))
.Concat(QSLinq(item.Where(i=>i>pivot));
}
n**********2
发帖数: 648
5
qsort [] = []
qsort (x:xs) = qsort (filter (<= x) xs) ++ [x] ++ qsort (filter (> x) xs)
n*w
发帖数: 3393
6
F#:
let rec qsort = function
| [] -> []
| x::xs -> let smaller,larger = List.partition (fun y -> y<=x) xs
qsort smaller @ [x] @ qsort larger
b*****t
发帖数: 840
7
好写好懂,
但pivot选的真心别扭
这比java估计慢二十倍以上
你写个性能好的haskell qsort绝壁比java难懂二十倍
语法糖没意思,haskell玩玩还可以,但绝壁不是industrial grade语言
n*w
发帖数: 3393
8
C#:
public static IEnumerable QSLinq(IEnumerable items)
{
if (items.Count() <= 1) return items;
var pivot = items.First();
return QSLinq(item.Where(i=>i .Concat(QSLinq(item.Where(i=>i==pivot))
.Concat(QSLinq(item.Where(i=>i>pivot));
}
s*i
发帖数: 5025
9
Quick sort 的精华部分还包括inplace的空间利用。
上述实现都忽略了
[发表自未名空间手机版 - m.mitbbs.com]
A*******e
发帖数: 2419
10
连基本的复杂度概念都没有。你那个filter能做到in-place move,且平均线性?
快排的精髓在那个in-place move。完整的快排算法是两部分:partition,sort。你大
笔一挥把partition给省了,这叫作弊。

【在 n**********2 的大作中提到】
: qsort [] = []
: qsort (x:xs) = qsort (filter (<= x) xs) ++ [x] ++ qsort (filter (> x) xs)

相关主题
nv的显卡能战胜intel的CPU么请教一个初级算法问题 (转载)
大家看看这个简单的qsort排序的问题算法之极弱问
一个C的void指针的问题问一个严肃的实用问题
进入Programming版参与讨论
A*******e
发帖数: 2419
11
+1
就是用伪代码写了个快排主程序而已,还沾沾自喜。

【在 s*i 的大作中提到】
: Quick sort 的精华部分还包括inplace的空间利用。
: 上述实现都忽略了
: [发表自未名空间手机版 - m.mitbbs.com]

g*********e
发帖数: 14401
12
Jvm乘务员的脑子里根本没有“空间”这个概念,他们写程序就是不停的new new new
d****i
发帖数: 4809
13
Plain old vanilla pure C code. Disclaimer: copied from online
#include
#include
static void swap(void *x, void *y, size_t l) {
char *a = x, *b = y, c;
while(l--) {
c = *a;
*a++ = *b;
*b++ = c;
}
}
static void sort(char *array, size_t size, int (*cmp)(void*,void*), int
begin, int end) {
if (end > begin) {
void *pivot = array + begin;
int l = begin + size;
int r = end;
while(l < r) {
if (cmp(array+l,pivot) <= 0) {
l += size;
} else if ( cmp(array+r, pivot) > 0 ) {
r -= size;
} else if ( l < r ) {
swap(array+l, array+r, size);
}
}
l -= size;
swap(array+begin, array+l, size);
sort(array, size, cmp, begin, l);
sort(array, size, cmp, r, end);
}
}
void qsort(void *array, size_t nitems, size_t size, int (*cmp)(void*,void*))
{
sort(array, size, cmp, 0, nitems*size);
}
typedef int type;
int type_cmp(void *a, void *b){ return (*(type*)a)-(*(type*)b); }
int main(void)
{ /* simple test case for type=int */
int num_list[]={5,4,3,2,1};
int len=sizeof(num_list)/sizeof(type);
char *sep="";
int i;
qsort(num_list,len,sizeof(type),type_cmp);
printf("sorted_num_list={");
for(i=0; i printf("%s%d",sep,num_list[i]);
sep=", ";
}
printf("};n");
return 0;
}
t**r
发帖数: 3428
14
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
let smallerOrEqual = [a | a <- xs, a <= x]
larger = [a | a <- xs, a > x]
in quicksort smallerOrEqual ++ [x] ++ larger
main = do
let a = [ 5, 1, 9, 4, 6, 7, 3]
print $ quicksort a
t**r
发帖数: 3428
15
你这是scala?

【在 n**********2 的大作中提到】
: qsort [] = []
: qsort (x:xs) = qsort (filter (<= x) xs) ++ [x] ++ qsort (filter (> x) xs)

a*****e
发帖数: 1700
16
求教一下,这个 C 程序非要用 void* 是个什么道理?会更快还是...?还从来没见过
这样写的快排

【在 d****i 的大作中提到】
: Plain old vanilla pure C code. Disclaimer: copied from online
: #include
: #include
: static void swap(void *x, void *y, size_t l) {
: char *a = x, *b = y, c;
: while(l--) {
: c = *a;
: *a++ = *b;
: *b++ = c;
: }

a*****e
发帖数: 1700
17
我很久以前写的,看看是否难懂 20 倍?
请自动忽略里面的 fork,当时是做了个 lightweight thread scheduler 拿快排做测
试。
> qsortM = qsort (i j a -> sysio $ qsplit i j a) fork
> qsort split fork (i, j) arr = aux (i, j)
> where
> aux (i, j) =
> if j <= i then return () else do
> k <- split i j arr
> if j - i > 10000 then (fork $ aux (i, k - 1)) >> return ()
> else aux (i, k - 1)
> aux (k + 1, j)
> qsplit left right arr = do
> v <- readArray arr right
> let split' i j = if j == right then (swap i right v) >> return i else do
> b <- readArray arr j
> if b <= v
> then (swap i j b) >> split' (i + 1) (j + 1)
> else split' i (j + 1)
> split' left left
> where
> swap i j b = do
> a <- readArray arr i
> writeArray arr i b
> writeArray arr j a

【在 b*****t 的大作中提到】
: 好写好懂,
: 但pivot选的真心别扭
: 这比java估计慢二十倍以上
: 你写个性能好的haskell qsort绝壁比java难懂二十倍
: 语法糖没意思,haskell玩玩还可以,但绝壁不是industrial grade语言

n**********2
发帖数: 648
18
void*, C 里面的generic type, 哈哈

【在 a*****e 的大作中提到】
: 求教一下,这个 C 程序非要用 void* 是个什么道理?会更快还是...?还从来没见过
: 这样写的快排

a*****e
发帖数: 1700
19
你和楼主是大水冲了龙王庙吗?LOL

【在 t**r 的大作中提到】
: 你这是scala?
a*****e
发帖数: 1700
20
就算是没有 C++ 里面的 template,也可以用 macro 定义一个 T 类型来做啊,不能理
解用 void* 和 size_t 这种做法。

【在 n**********2 的大作中提到】
: void*, C 里面的generic type, 哈哈
相关主题
哪位大侠给说说 何时用 merge sort, 何时用 quick sort, 何时Leetcode上面的"Search in rotated sorted array II"
包子问使用C templates Sort data的问题大家有没有觉得Scala不如Haskell美?
Is it safe to use unique_ptr with STL container?Shuffle performance (C#)
进入Programming版参与讨论
b*****t
发帖数: 840
21
你觉得呢?
这还不够反人类?

【在 a*****e 的大作中提到】
: 我很久以前写的,看看是否难懂 20 倍?
: 请自动忽略里面的 fork,当时是做了个 lightweight thread scheduler 拿快排做测
: 试。
: > qsortM = qsort (i j a -> sysio $ qsplit i j a) fork
: > qsort split fork (i, j) arr = aux (i, j)
: > where
: > aux (i, j) =
: > if j <= i then return () else do
: > k <- split i j arr
: > if j - i > 10000 then (fork $ aux (i, k - 1)) >> return ()

g*****y
发帖数: 7271
22
还是 C 看着亲切,void* 就更亲切了,哈哈

【在 d****i 的大作中提到】
: Plain old vanilla pure C code. Disclaimer: copied from online
: #include
: #include
: static void swap(void *x, void *y, size_t l) {
: char *a = x, *b = y, c;
: while(l--) {
: c = *a;
: *a++ = *b;
: *b++ = c;
: }

d****i
发帖数: 4809
23
C里面的void *指针就相当于泛型,这样传入swap函数的可以是任何primitive或者
struct的类型,当然要给定字节长度。用宏来做的话当然也可以,但是不推荐,宏没有
类型检查,容易出错。

【在 a*****e 的大作中提到】
: 就算是没有 C++ 里面的 template,也可以用 macro 定义一个 T 类型来做啊,不能理
: 解用 void* 和 size_t 这种做法。

z****e
发帖数: 54598
24
只能说明你还只是一个初级java程序员
连中级都说不上,spring等框架都统一管理内存
高级程序员会用jmx监控memory的使用情况

new

【在 g*********e 的大作中提到】
: Jvm乘务员的脑子里根本没有“空间”这个概念,他们写程序就是不停的new new new
i**p
发帖数: 902
25
请问面试20分钟写一个quicksort对于毕业10年的工业界程序员reasonable吗?

【在 z****e 的大作中提到】
: 只能说明你还只是一个初级java程序员
: 连中级都说不上,spring等框架都统一管理内存
: 高级程序员会用jmx监控memory的使用情况
:
: new

h*****y
发帖数: 298
26
可以问问基本sort算法在各种应用场景下可以作哪些优化。什么情况下sort会成为性能
瓶颈。做过大数据看过一点terasort的人一般能说出个大概吧。然后就可以接着问问
hadoop eco. 光考个quick sort对被面试的人是非常不负责任的。毕竟人家大老远请假
跑来面试也不容易吧。

【在 i**p 的大作中提到】
: 请问面试20分钟写一个quicksort对于毕业10年的工业界程序员reasonable吗?
g*********e
发帖数: 14401
27

hehe jvm程序员可写不出spring框架 他们只会用

【在 z****e 的大作中提到】
: 只能说明你还只是一个初级java程序员
: 连中级都说不上,spring等框架都统一管理内存
: 高级程序员会用jmx监控memory的使用情况
:
: new

i**p
发帖数: 902
28
不是光考quick sort. quick sort for first 20 minutes.

【在 h*****y 的大作中提到】
: 可以问问基本sort算法在各种应用场景下可以作哪些优化。什么情况下sort会成为性能
: 瓶颈。做过大数据看过一点terasort的人一般能说出个大概吧。然后就可以接着问问
: hadoop eco. 光考个quick sort对被面试的人是非常不负责任的。毕竟人家大老远请假
: 跑来面试也不容易吧。

b*****t
发帖数: 840
29
写不出来qsort不一定是什么问题,这里有区别
工业经验长的反而不一定记得qsort的算法过程,是有可能的,没有大问题,看一下
spec能写出就行
但是如果知道大概的算法,但无能力转化成code,那就不要滥竽充数了,太差
数学所用的思维和programming至少有些部分是mutually exclusive
不少数学系的很牛人,写个matlab都费劲,手把手教了这个,换个algo又趴下了,就是
没有那个代码表达能力,见得太多了

【在 i**p 的大作中提到】
: 请问面试20分钟写一个quicksort对于毕业10年的工业界程序员reasonable吗?
i**p
发帖数: 902
30
那好, 20分钟内读qsort spec, 写出正确的代码, 对工业经验长的合适吗?

【在 b*****t 的大作中提到】
: 写不出来qsort不一定是什么问题,这里有区别
: 工业经验长的反而不一定记得qsort的算法过程,是有可能的,没有大问题,看一下
: spec能写出就行
: 但是如果知道大概的算法,但无能力转化成code,那就不要滥竽充数了,太差
: 数学所用的思维和programming至少有些部分是mutually exclusive
: 不少数学系的很牛人,写个matlab都费劲,手把手教了这个,换个algo又趴下了,就是
: 没有那个代码表达能力,见得太多了

相关主题
Java 8的streaming我写的quick sort
tensorflow太扯了underlying sort algorithm for SET in STL?
我也来一个, quick sort 只要一行。靠。Sedgewick这3w-qsort算法居然还有bug!
进入Programming版参与讨论
b*****t
发帖数: 840
31
20分钟写qsort是worst case scenario,
写得出不证明合适,
写不出一定不合适

【在 i**p 的大作中提到】
: 那好, 20分钟内读qsort spec, 写出正确的代码, 对工业经验长的合适吗?
z****e
发帖数: 54598
32
spring的本质就是reflection
which在1.4时代经常拿来面试的东西

【在 g*********e 的大作中提到】
:
: hehe jvm程序员可写不出spring框架 他们只会用

z****e
发帖数: 54598
33
我反正用hadoop的过程中还没遇到过用快排的地方
现在基本上都不sort了,要sort的话,建index的cache就好了
不需要等到用的时候再sort,那多慢呀,而且又吃内存
多sort几下,整个系统就别干其他事了,光忙着sort了
而且快排能并行么?我好像是不太记得怎么做快排的并行
所以感觉做hadoop什么不合适,terasort第一步就是并行化处理
不过说到这里我突然想起来,terasort跟quicksort倒是有些共通之处
可以按照terasort的方式做,但是那样就是terasort而非qs了

【在 h*****y 的大作中提到】
: 可以问问基本sort算法在各种应用场景下可以作哪些优化。什么情况下sort会成为性能
: 瓶颈。做过大数据看过一点terasort的人一般能说出个大概吧。然后就可以接着问问
: hadoop eco. 光考个quick sort对被面试的人是非常不负责任的。毕竟人家大老远请假
: 跑来面试也不容易吧。

1 (共1页)
进入Programming版参与讨论
相关主题
大家有没有觉得Scala不如Haskell美?嵌入式系统用什么sorting算法比较好?
Shuffle performance (C#)nv的显卡能战胜intel的CPU么
Java 8的streaming大家看看这个简单的qsort排序的问题
tensorflow太扯了一个C的void指针的问题
我也来一个, quick sort 只要一行。请教一个初级算法问题 (转载)
我写的quick sort算法之极弱问
underlying sort algorithm for SET in STL?问一个严肃的实用问题
靠。Sedgewick这3w-qsort算法居然还有bug!哪位大侠给说说 何时用 merge sort, 何时用 quick sort, 何时
相关话题的讨论汇总
话题: qsort话题: xs话题: void话题: pivot话题: int