问题XYZ的10种语言解决方案(一)之C语言篇
写这篇,或者这个系列的无聊博客文章完全是由于昨晚没事瞎想想到的,本来是在思考《Learn you a Hashkell for Great Good》中快速排序的Haskell实现代码,突然想到用其它语言来写写,然后做做对比其实很有意思,于是决定今天起来就做这件事情,由于是在想快速排序时想到的,因此也就将快速排序的实现作为第一篇吧。
在这个系列的博客文章里(当然也许就这一篇,我不保证,哪天无聊了也许会写第二篇,第三篇......),我会尝试用我接触过的编程语言来解决一系列乱七八糟的问题,并尝试分析比较不同语言的解决方案,主要从表达力和抽象封装度两个方面吧,暂时也就想到这两个方面。当然,我得承认,这10种语言我常用的不过两三种而已,甚至在写这篇博客之前我都没用过D和Lua,但是我对它们都很感兴趣,所以也放在这里,就当练习;而我虽然用过或者知道,但是目前不是很感兴趣的语言,例如汇编语言(实在太低级,就是一堆PUSH、POP、CALL INT了,里面转一圈的话我都不知道怎么写“Hello,World”了)、Basic(没什么兴趣)、C++(杀了我吧,光是虚析构函数、纯虚函数什么的东东就让人晕菜了,更别提编译器私底下自以为是搞的一大坨乱七八糟的东西)等。
好吧,废话少说,就正式开始吧。在这篇博客里,我们将使用C、Clojure、D、Factor、JavaScript、Groovy、Haskell、Java、Lua、Python这10种编程语言来实现快速排序。
问题描述:呃,如果你不知道快速排序的话那么还是自己去找本教科书或去google一下吧,我在这里就不赘述了。
按照字母排序,就先从C开始吧。
#include <stdio.h>#include <stdlib.h>#include <string.h>#include "qsort.h"void q_sort(int* values){ if(values.length <= 1) return; size_t length = values.length; size_t wl = sizeof(int); int* p = malloc(wl * length); if(p == NULL) exit(1); int* p1 = malloc(wl * length); if(p1 == NULL) exit(1); int lp = 0, lp1 = 0, i = 1,value = values[0]; int* cp = p; int* cp1 = p1; for(; i < length; i++) { if(values[i] <= value) { (*p) = values[i]; p++; lp++; } else { (*p1) = values[i]; p1++; lp1++; } } values[lp] = value; q_sort(cp,lp); q_sort(cp1,lp1); i = lp; while(i > 0) { values[i - 1] = cp[i - 1]; i--; } i = 1; while(lp1 > 0) { values[lp + i] = cp1[i - 1]; lp1--; i++; }}
,好吧,改写一下:#include <stdio.h>#include <stdlib.h>#include <string.h>#include "qsort.h"void q_sort(int* values, size_t length){ if(length <= 1) return; size_t wl = sizeof(int); int* p = malloc(wl * length); if(p == NULL) exit(1); int* p1 = malloc(wl * length); if(p1 == NULL) exit(1); int lp = 0, lp1 = 0, i = 1,value = values[0]; int* cp = p; int* cp1 = p1; for(; i < length; i++) { if(values[i] <= value) { (*p) = values[i]; p++; lp++; } else { (*p1) = values[i]; p1++; lp1++; } } values[lp] = value; q_sort(cp,lp); q_sort(cp1,lp1); i = lp; while(i > 0) { values[i - 1] = cp[i - 1]; i--; } i = 1; while(lp1 > 0) { values[lp + i] = cp1[i - 1]; lp1--; i++; } free(cp); cp = NULL; free(cp1); cp1 = NULL;}void q_sort_g(void* pValue, size_t length, size_t wl, compare cmp) { if(length <= 1) { return; } void* p = malloc(wl * length); if(p == NULL) exit(1); void* p1 = malloc(wl * length); if(p1 == NULL) exit(1); int lp = 0, lp1 = 0; int i = 1; BYTE* b = (BYTE*)pValue; BYTE* pivot = b; b += wl; BYTE* b1 = (BYTE*)p; BYTE* b2 = (BYTE*)p1; BYTE* b3 = NULL; for(; i < length; i++) { int result = cmp(b,pivot); if(result <= 0) { b3 = (BYTE*)b1; b1 += wl; lp++; } else { b3 = (BYTE*)b2; b2 += wl; lp1++; } memcpy(b3,b,wl); b += wl; }- q_sort_g(p,lp,wl,cmp); q_sort_g(p1,lp1,wl,cmp); memcpy(pValue + lp * wl, pValue, wl); memcpy(pValue,p,lp * wl); memcpy(pValue + lp * wl + wl,p1,lp1 * wl); free(p); free(p1); p = NULL; p1 = NULL; } static int intCmp(void* v1, void* v2) { int* pV1 = (int*)v1; int* pV2 = (int*)v2; return (*pV1) - (*pV2); }