[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
下午刚写了个快速排序,正好用上啦.冒泡就不写了.
cls&@echo off&setlocal enabledelayedexpansion
set "strings=3 2008 11 19 777 23 2014 453 789 51"
echo %strings%
set/a n=0
for %%i in (%strings%) do (
   
set/a n+=1
   
set num[!n!]=%%i
)
call :quicksort num 1 %n%
for /l %%i in (1,1,%n%) do echo !num[%%i]!

pause&goto:eof

:QuickSort
::code by dishuostec
::use call :quicksort arrary low high
set "ARR=%1"
set/a dep=0
call :QS %2 %3
goto:eof
:QS
set/a dep+=1,lTmpLow=%1,lTmpHi=%2,Low=%1,Hi=%2
if %Hi% leq %Low% set/a dep-=1&goto :eof
set/a lTmpMid=(Low+Hi)/2
call set/a vTempVal=%%%ARR%[!lTmpMid!]%%
:qsMainLoop
if !lTmpLow! leq !lTmpHi! (
   
:qsLoop1
   
call set/a vVal=%%%ARR%[!lTmpLow!]%%
   
if !vVal! lss !vTempVal! if !lTmpLow! lss !Hi! set/a lTmpLow+=1& goto qsLoop1
   
:qsLoop2
   
call set/a vVal=%%%ARR%[!lTmpHi!]%%
   
if !vTempVal! lss !vVal! if !Low! lss !lTmpHi! set/a lTmpHi-=1&goto qsLoop2
   
:qsSwap
   
if !lTmpLow! leq !lTmpHi! (
        
call set/a vTmpHold=%%%ARR%[!lTmpLow!]%%
        
call set/a %ARR%[!lTmpLow!]=%%%ARR%[!lTmpHi!]%%
        
set/a %ARR%[!lTmpHi!]=vTmpHold
        
set/a lTmpLow+=1,lTmpHi-=1
    )
goto qsMainLoop
)
set/a lTmpLow[%dep%]=lTmpLow,Hi[%dep%]=Hi
if %Low% lss %lTmpHi% call :QS %Low% %lTmpHi%
call set lTmpLow=%%lTmpLow[!dep!]%%&call set Hi=%%Hi[!dep!]%%
if %lTmpLow% lss %Hi% call :QS %lTmpLow% %Hi%
set/a dep-=1&goto :eof
1

评分人数

    • pusofalse: 除了简洁,所有要求都达到了。PB + 10
高手=发现问题^分析问题^解决问题

TOP

嫌代码长可以用冒泡法,但是数据量大的时候效率比快速排序低.
另外,我写的这两种排序都是通用模块,移植的拷过去就行.
cls&@echo off&setlocal enabledelayedexpansion
set "strings=3 2008 11 19 777 23 2014 453 789 51"
echo %strings%
set/a n=0
for %%i in (%strings%) do (
   
set/a n+=1
   
set num[!n!]=%%i
)
call :popsort num 1 %n%
for /l %%i in (1,1,%n%) do echo !num[%%i]!
pause&goto:eof

:PopSort
::code by dishuostec
::use call :PopSort arrary low highset "ARR=%1"
set /a PS_l=%3
for /l %%i in (%2,1,%3) do (
   
set/a PS_l-=1
   
for /l %%j in (%2,1,!PS_l!) do (
        
set/a PS_index2=%%j+1
        
call set PS_v1=%%%ARR%[%%j]%%&call set PS_v2=%%%ARR%[!PS_index2!]%%
        
if !PS_v1! gtr !PS_v2! set %ARR%[!PS_index2!]=!PS_v1!&set %ARR%[%%j]=!PS_v2!
    )
)
高手=发现问题^分析问题^解决问题

TOP

返回列表