而通常这是很好的选择正确的语言的工作,它有时可能是有益的尝试做一些事情的语言,这是极不适当的。

  1. 它可以帮助你理解这个问题更好。也许你不 到解决方法你以为你做的。
  2. 它可以帮助你理解的语言更好。也许它支持更多的功能比你实现。

和推动这个主意,这是不合逻辑的结论...你将如何实现快速排序在一批文件?它甚至有可能吗?

有帮助吗?

解决方案

事实证明,它并不难如你想象的。法是丑陋的地狱,但批语法实际上是能够一些令人吃惊的东西,包括递归、地方变量,以及一些令人惊讶的复杂的分析的弦。不要误会我,这是一个可怕的语言,但令我吃惊的是,它不是完全瘫痪。我不认为我了解到任何关于快速排序,但是我学到了很多关于批量文件!

在任何情况下,这是快速排序在一批文件-和我希望你有那么多乐趣,试图理解的奇怪的语法,同时阅读它,因为我没有同时编写。:-)

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

call :qSort %*
for %%i in (%return%) do set results=!results! %%i
echo Sorted result: %results%
ENDLOCAL
goto :eof

:qSort
SETLOCAL
    set list=%*
    set size=0
    set less=
    set greater=
    for %%i in (%*) do set /a size=size+1
    if %size% LEQ 1 ENDLOCAL & set return=%list% & goto :eof
    for /f "tokens=2* delims== " %%i in ('set list') do set p=%%i & set body=%%j
    for %%x in (%body%) do (if %%x LEQ %p% (set less=%%x !less!) else (set greater=%%x !greater!))
    call :qSort %less%
    set sorted=%return%
    call :qSort %greater%
    set sorted=%sorted% %p% %return%
ENDLOCAL & set return=%sorted%
goto :eof

叫它通过给予它的一组数字排序上的命令行,相隔的空间。例如:

C:\dev\sorting>qsort.bat 1 3 5 1 12 3 47 3
Sorted result:  1 1 3 3 3 5 12 47

代码是一个有点痛了解。它的基本标准的快速排序.关键位,我们储存的数字一串-可怜的人的阵列。第二循环是很模糊的,它基本上是分裂该列入一个头(的第一个元素)和一个尾部(所有其他元素)。Haskell没有记号的x:xs,但批量文件做一个用于环叫/f开关。为什么?为什么不呢?

该SETLOCAL和该值则呼吁让我们做地方变量的排序。SETLOCAL为我们提供了一个完整副本的原始变量,但是所有的改变都是完全消灭时,我们呼吁该值则,这意味着你甚至不能与调功能使用globals.这就解释了丑陋的"该值则和设置返回=%排%"法,其实际工作,尽管有什么样的逻辑指示。当线执行排序变并没有被消灭,因为该路线还没有被执行呢-那之后返回的变量,不是消灭,因为该行已经执行。合乎逻辑的!

此外,有趣的是,你根本不能使用的变量内的循环,因为他们不能改变其消除最点的具有针对循环。该解决办法是设置ENABLEDELAYEDEXPANSION其工作,但语法丑陋甚至比正常的。通知我们现在有一混合变量的参考只是通过他们的名字,通过前面加上他们用一个单一%,通过前面加上他们有两个%,通过包裹,他们在%,或通过包裹,他们!。和这些不同的方式引用的变量几乎完全不可互换!

除此之外,它应当较容易理解!

其他提示

这是我之前写的一个更易读的版本:

@echo off

echo Sorting:  %*

set sorted=

:sort
:: If we've only got one left, we're done.
if "%2"=="" (
  set sorted=%sorted% %1
  :: We have to do this so that sorted gets actually set before we print it.
  goto :finalset
)
:: Check if it's in order.
if %1 LEQ %2 (
  :: Add the first value to sorted.
  set sorted=%sorted% %1
  shift /1
  goto :sort
)
:: Out of order.
:: Reverse them and recursively resort.
set redo=%sorted% %2 %1
set sorted=
shift /1
shift /1
:loop
if "%1"=="" goto :endloop
set redo=%redo% %1
shift /1
goto :loop
:endloop
call :sort %redo%
:: When we get here, we'll have already echod our result.
goto :eof

:finalset
echo Final Sort:  %sorted%
goto :eof

示例:

C:\Path> sort 19 zebra blah 1 interesting 21 bleh 14 think 2 ninety figure it out

产生

Sorting:  19 zebra blah 1 interesting 21 bleh 14 think 2 ninety figure it out
Final Sort:   1 2 14 19 21 blah bleh figure interesting it ninety out think zebra
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top