كيف يمكنني تنفيذ فرز سريع باستخدام ملف دفعي?

StackOverflow https://stackoverflow.com/questions/133154

  •  02-07-2019
  •  | 
  •  

سؤال

بينما عادة من الجيد دائما أن تختار اللغة المناسبة للحصول على الوظيفة ، يمكن في بعض الأحيان يكون من المفيد أن نحاول فعل شيء في لغة غير ملائمة.

  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

رمز قليلا من الألم أن نفهم.انها في الاساس معيار فرز سريع.بت الرئيسية هي أننا تخزين الأرقام في السلسلة الرجل الفقير الصفيف.الثاني للحلقة غامض جدا, هو في الأساس تقسيم المصفوفة إلى رئيس (العنصر الأول) والذيل (جميع العناصر الأخرى).هاسكل يفعل ذلك مع ملاحظه×: xs ، ولكن الملفات الدفعية مع حلقة دعا مع التبديل /f.لماذا ؟ لماذا لا ؟

على SETLOCALE و ENDLOCAL المكالمات دعونا نفعل المتغيرات المحلية - نوعا ما -SETLOCALE يعطينا نسخة كاملة من المتغيرات الأصلية ، ولكن كل التغييرات تماما عندما ندعو ENDLOCAL, مما يعني أنك لا يمكن حتى التواصل مع استدعاء الدالة باستخدام globals.وهذا ما يفسر القبيح "ENDLOCAL & set عودة=%فرز%" بناء الجملة الذي يعمل في الواقع على الرغم من ما المنطق الإشارة.عندما يكون الخط تنفيذ فرز متغير لم تمحى لأن الخط لم يتم تنفيذها حتى الآن - ثم بعد ذلك عودة متغير لا تمحى لأن الخط قد تم بالفعل تنفيذها.منطقي!

أيضا, متعجبا, أنت أساسا لا يمكن استخدام المتغيرات داخل حلقة for لأنهم لا يستطيعون التغيير الذي يزيل معظم الفائدة من وجود حلقة for.الحل هو تعيين 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