**Lua這類腳本語言在處理業務邏輯作為配置文件的時候方便省事?但是在大量需要 運算的地方就顯得略微不足???按照 Lua內建排序算法?對比C/C++ PHP Java等的快速排序算法進行一下比較。**
**快速排序算法是基于冒泡排序,優化而來,時間復雜度T(n)=O(nLog2n)? ,可見內部采用了二分策略 。**
**發現在LuaIDE LDT下直接運行效率要比?通過C++加載運行Lua腳本效率高的多??拿500W個數據排序?來說? ,腳本如下****
**同樣的排序腳本Lua解釋器的內置排序算法在LDT下,運行速度比通過C/C++內嵌Lua解釋器調用的快14倍之多**
**而C/C++的快速排序速度又是Lua?內嵌排序算法的速度的40倍之多,LDT下的lua排序的3倍之多,起碼在我的電腦上?看到的是這樣的效果。**
**PHP實現的快速排序算法**
PHP簡直不敢用它做排序,頁面緩存池容量太小了,5W個數據排序就已經吃不消了。。。。。??效率遠不如Lua?所以還是老老實實的用它做web CRUD吧。。就算配置了?頁面內存池大小也無法滿足需求? 5000就花費了接近2s
~~~還是附上代碼吧
~~~
<?php
define('ARRAY_SIZE',5000);
function QuickSort($arr,$low,$high)
{
if($low>$high)
return ;
$begin=$low;
$end=$high ;
$key=$arr[$begin];
while($begin<$end)
{
while($begin<$end&&$arr[$end]>=$key)
--$end ;
$arr[$begin]=$arr[$end];
while($begin<$end&&$arr[$begin]<=$key)
++$begin;
$arr[$end]=$arr[$begin];
}
$arr[$begin]=$key;
QuickSort($arr,$low,$begin-1);
QuickSort($arr,$begin+1,$high);
}
$arr=array();
echo '插入前時間:'.time().'<br/>';
for($i=0;$i<ARRAY_SIZE;$i++)
{
array_push($arr,rand(1,50000));
}
echo '插入后時間:'.time().'<br/>';
echo '排序前時間:'.time().'<br/>';
QuickSort($arr,0,ARRAY_SIZE-1);
echo '排序后時間:'.time().'<br/>';
?>
~~~

**Java實現的快速排序算法如果不是因為Java大數據處理JVM容易出現棧溢出,那么效率上和C/C++持平?? 甚至優于這一點JVM做的很漂亮??據一位大哥說**是just?in?Time?Compile技術**,和.NET一樣?小段代碼執行效率特別高,大程序就不行了。**
**[Java](http://www.searchsoa.com.cn/whatis/word_2646.htm)編程語言和環境中,即時編譯器(JIT compiler,just-in-time[ compiler](http://www.whatis.com.cn/word_1285.htm))是一個把Java的字節碼(包括需要被解釋的指令的程序)轉換成可以直接發送給處理器([processor](http://www.searchcio.com.cn/whatis/word_3818.htm))的指令的程序。當你寫好一個Java程序后,源語言的語句將由Java編譯器編譯成字節碼,而不是編譯成與某個特定的處理器硬件平臺對應的指令代碼(比如,Intel的[Pentium](http://www.searchcio.com.cn/whatis/word_3547.htm)微處理器或IBM的System/390處理器)。字節碼是可以發送給任何平臺并且能在那個平臺上運行的獨立于平臺的代碼。
過去,大多數用任何語言寫的程序在每個電腦平臺上都必須重編譯,甚至有時需要重寫。Java最大的優點之一就是你只需要寫和編譯一次程序。在任何平臺上,Java都會將編譯好的字節碼解釋成能被特定的處理器所理解的指令。盡管如此,Java虛擬機一次只能處理一條字節碼指令。在特定的系統平臺上使用Java即時編譯器(實際上是第二個編譯器)能把字節碼編譯成特定系統的代碼(雖然這個程序最初已經在這個平臺上被編譯過)。一旦代碼被JIT編譯器(重)編譯后,它在電腦上通常就會運行地更快。
即時編譯器(JIT compiler)隨虛擬機一起供給的,并可選使用。它把字節碼編譯成可立即執行的指定平臺的可執行代碼。Sun微系統建議,選擇JIT編譯器選項通常會使程序運行地更快,尤其是當某個可執行的方法被重復使用時**
~~~
print("插入前時間",os.clock())
--定義table變量
sorTable={}
for i=1,5000000,1 do
sorTable[i]=i
end
print('插入數據后時間:',os.clock())
print('插入了',#sorTable,'個數據!')
print('排序前時間:',os.clock())
table.sort(sorTable,
function(a,b)
if(a<b) then
return true
else
return false
end
end
)
print("排序后時間:",os.clock())
~~~
如上代碼在 LDT內直接運行?如下結果?顯示6s排序完 500W個數組的數據,但是同樣的 Lua腳本內嵌到C++解釋器解釋執行效率缺可怕的要命

通過Lua C++加載上述Lua腳本運行之后結果如下,缺花了80S多,插入和排序的速度都變慢了 ? 所以?利用C++加載Lua?做類似操作?是得不償失的同樣的Lua腳本通過 C++內嵌解釋調用速度變得如此之慢,下面再看看C++PHP JAVA中內排序算法的效率。

**對于C/C++處理大批量數據,那絕對是優勢,下面是使用?快速排序算法 實現 500W數據內容排序,僅僅花了2s的時間是LDT下的三倍 ,是通過C/C++加載Lua腳本的40倍之多。**
~~~
#include "stdafx.h"
#include "time.h"
#include "stdlib.h"
#include "stdio.h"
#define ARRSIZE 5000000
//快速排序
//以key為基準 進行遞歸排序 思路來源于 冒泡排序算法
///把數據一分為二 key的兩邊分別是 大于key 小于key的數據 進行遞歸從而進行排序
//時間復雜度是 nlog2n
void QuickSort(int arr[],int low,int high)
{
if(low>=high)
return ;
int begin=low ; //記錄當前調用的起點index
int end=high ; //記錄當前的終點index
int key=arr[begin]; //以此為軸進行劃分
while(begin<end)
{
while(begin<end&&arr[end]>=key) //從右邊尋找一個小 值
end--;
arr[begin]=arr[end];
while(begin<end&&arr[begin]<=key)//從左邊尋找一個大的值
begin++;
arr[end]=arr[begin];
}
arr[begin]=key; //最后將key放入到剩余位置
QuickSort(arr,low,begin-1); //left 遞歸
QuickSort(arr,begin+1,high); //right 遞歸
}
int _tmain(int argc,char*argv[])
{
int *pArray=new int[ARRSIZE];
time_t tm ;
time(&tm);
printf("插入前時間:%d\n",tm);
srand((unsigned int)time(NULL));
for (int i=0;i<ARRSIZE;i++)
{
pArray[i]=rand();
}
time(&tm);
printf("插入后時間:%d\n",tm);
time(&tm);
printf("排序前時間:%d\n",tm);
QuickSort(pArray,0,ARRSIZE-1);
time(&tm);
printf("排序后時間:%d\n",tm);
delete []pArray;
return 0 ;
}
~~~
~~~
~~~
**運行結果可想而知,對于C/C++來說?耗費時間幾乎為2s ,所以對于Lua這一類腳本語言來說?處理大數據運算絕對不是明智之舉**
基于Java的快速排序算法,我有些不敢相信自己的眼睛了?同樣的快速排序算法?跑在JVM上的java居然比C++快一些? 500W個排序數據???花了不到2s的時間.........................
~~~
import java.lang.String;
import java.util.Date;
import java.util.Random;
public class QuickSort
{
public static final int MAX_SIZE=5000000;
//實例初始化
{
this.a=new int[MAX_SIZE];
///
System.out.println("插入前時間:"+new Date().getTime()+"ms");
Random rm=new Random(100) ;
for(int i=0;i<QuickSort.MAX_SIZE;i++)
{
this.a[i]=rm.nextInt(50000) ; //隨機數
}
System.out.println("插入后時間:"+new Date().getTime()+"ms");
System.out.println("排序前時間:"+new Date().getTime()+"ms");
QuickSortMethod(this.a,0,this.a.length-1);
System.out.println("排序后時間:"+new Date().getTime()+"ms");
//System.out.println(Arrays.toString(this.a));
}
//快速排序算法java實現 和C++一樣
public void QuickSortMethod(int[] arr,int low,int high)
{
if(low>=high)
return ;
int begin=low;
int end=high;
int key=arr[begin]; //key
while(begin<end)
{
while(begin<end&&arr[end]>=key)
{
--end;
}
arr[begin]=arr[end];
while(begin<end&&arr[begin]<=key)
{
++begin;
}
arr[end]=arr[begin];
}
arr[begin]=key;
QuickSortMethod(arr,low,begin-1);
QuickSortMethod(arr,begin+1,high);
}
private int[] a;
public static void main(String[]argv)
{
new QuickSort();
}
}
~~~
上圖

QQ 4223665????技術交流群
*群號是*387761601
歡迎大家一起交流軟件技術
- 前言
- C++數據結構與算法------------二叉樹的2種創建
- 二叉樹的創建以及利用迭代實現中序、先序、后序遍歷、清空
- 數據結構-----哈夫曼樹的構造以及遍歷
- 二叉搜索樹的非遞歸創建和搜索
- 二叉搜索樹非遞歸方式刪除節點
- Lua中table內建排序與C/C++/Java/php/等內排序算法的排序效率比較
- 內嵌匯編與C/C++實現的冒泡排序,快速排序算法排序500W個數據對比
- 菜鳥學算法--簡單的交換和最大公約數算法入門篇
- 菜鳥學算法----改進后的歐幾里得算法
- C++實現一個線程安全的單例工廠
- 關于有序二維矩陣查找和字符串替換的兩道算法題
- 算法有序數組合并---在空間足夠的情況下,進行O(n)的合并 并且移動次數最小