Board logo

标题: [原创] 常见几种排序的批处理写法 [打印本页]

作者: tyc    时间: 2009-4-17 10:01     标题: 常见几种排序的批处理写法

一、选择排序法
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. ::选择排序法
  4. echo 共输入10个数
  5. for /l %%i in (1,1,10) do (
  6. set /p a_%%i=请输入%%i个数
  7. set str=!str! !a_%%i!
  8. )
  9. echo %str%
  10. for /l %%i in (1,1,10) do (
  11. set /a b=%%i+1
  12. for /l %%j in (!b!,1,10) do (
  13.    if !a_%%i! gtr !a_%%j! (
  14.       set /a t=a_%%i
  15.       set /a a_%%i=a_%%j
  16.       set /a a_%%j=t
  17.     )
  18. )
  19. )
  20. for /l %%i in (1,1,10) do (
  21. set str1=!str1! !a_%%i!
  22. )
  23. echo %str1%
  24. pause>nul
复制代码
二、冒泡排序法
  1. ::冒泡排序法
  2. @echo off
  3. setlocal enabledelayedexpansion
  4. for /l %%i in (1,1,10) do (
  5. set /p a_%%i=请输入第%%i个数:
  6. set num=!num! !a_%%i!
  7. )
  8. echo %num%
  9. for /l %%i in (1,1,10) do (
  10.    set /a b=10-%%i
  11.    for /l %%j in (1,1,!b!) do (
  12.        set /a t=%%j+1
  13.        set /a d=a_!t!
  14.        if !a_%%j! gtr !d! (
  15.              set /a x=!a_%%j!
  16.              set /a a_%%j=d
  17.              set /a a_!t!=!x!
  18. )
  19. )
  20. )
  21. for /l %%i in (1,1,10) do (
  22. set str=!str! !a_%%i!
  23. )
  24. echo %str%
  25. pause>nul
复制代码
三、后序插入排序法
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%i in (1,1,10) do (
  4. set /p a_%%i=请输入第%%i个数:
  5. set str=!str! !a_%%i!
  6. )
  7. echo 你输入的数列是: !str!
  8. for /l %%i in (1,1,10) do (
  9. rem set /a b=a_%%i
  10. rem echo !b!===
  11. set /a c=%%i+1
  12. for /l %%j in (!c!,1,10) do (
  13.    if !a_%%j! lss !a_%%i! (
  14.    set /a t=!a_%%j!
  15.    set /a a_%%j=!a_%%i!
  16.    set /a a_%%i=!t!
  17. )
  18. )  
  19. )
  20. for /l %%i in (1,1,10) do set stri=!stri! !a_%%i!
  21. echo !stri!
  22. pause>nul
复制代码
四、后序插入排序优化
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%i in (1,1,10) do (
  4. set /p a_%%i=请输入第%%i个数:
  5. set str=!str! !a_%%i!
  6. )
  7. echo 你输入的数列是: !str!
  8. for /l %%i in (1,1,10) do (
  9. set /a p=a_%%i
  10. set /a b=%%i+1
  11. for /l %%j in (!b!,1,10) do (
  12.    if !a_%%j! lss !p!  set /a p=a_%%j&set /a pp=%%j
  13. )  
  14. set /a t=!a_%%i!
  15. set /a a_%%i=!p!
  16. set /a a_!pp!=!t!  
  17. )
  18. for /l %%i in (1,1,10) do set stri=!stri! !a_%%i!
  19. echo !stri!
  20. pause>nul
复制代码
还要四种传统排序,以后再写

[ 本帖最后由 tyc 于 2009-4-17 10:03 编辑 ]
作者: Batcher    时间: 2009-4-17 12:44

不知楼主是原创还是转帖。如果是原创,当加分鼓励;如果是转帖,望注明出处。

直接插入排序
http://www.cn-dos.net/forum/viewthread.php?tid=33569
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :::::::::::::::::::::::::::::::::::::::::Straight Insertion Sort:::::::::::::::::::::::::::::::::::::::::
  4. ::::::::Get Original Numbers::::::::
  5. echo Please input some numbers separated from "," , like 2007,9,14,88:
  6. set /a s=0
  7. set /p str=
  8. set /a len=0
  9. set /a nx=0
  10. :c
  11. call set word=%%str:~%len%,1%%
  12. set /a len+=1
  13. if "%word%" equ "," (set /a nx+=1 & call :e)
  14. if not "%word%" equ "" (goto :c)
  15. set /a nx+=1
  16. call :e
  17. goto :o
  18. :e
  19. set /a sn=%len%-%s%-1
  20. call set n%nx%=%%str:~%s%,%sn%%%
  21. set /a s=%len%
  22. goto :eof
  23. ::::::::Get Original Numbers::::::::
  24. ::::::::Deal With Numbers::::::::
  25. :o
  26. set /a num=%nx%+1
  27. set /a i=2
  28. :m
  29. set /a temporary=!n%i%!
  30. set /a j=%i%-1
  31. :j
  32. if %temporary% lss !n%j%! (goto :ch)
  33. goto :z
  34. :ch
  35. set /a k=%j%+1
  36. set /a n%k%=!n%j%!
  37. set /a j-=1
  38. if %j% gtr 0 goto :j
  39. :z
  40. set /a k=%j%+1
  41. set /a n%k%=%temporary%
  42. set /a i+=1
  43. if %i% lss %num% goto :m
  44. ::::::::Deal With Numbers::::::::
  45. ::::::::Print The Result::::::::
  46. for /l %%a in (1,1,%nx%) do (set str2=!str2!!n%%a! )
  47. echo.
  48. echo The numbers after sorting are:
  49. echo !str2!
  50. echo.
  51. echo Press Any Key To Exit...
  52. pause>nul
  53. goto :eof
  54. ::::::::Print The Result::::::::
  55. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::s11ss
  56. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2007-9-14
复制代码
希尔排序
http://www.cn-dos.net/forum/viewthread.php?tid=33578
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :::::::::::::::::::::::::::::::::::::::::Shell Sort:::::::::::::::::::::::::::::::::::::::::
  4. ::::::::Get Original Numbers::::::::
  5. echo Please input some numbers separated from "," , like 2007,9,14,88:
  6. set /a s=0
  7. set /p str=
  8. set /a len=0
  9. set /a nx=0
  10. :c
  11. call set word=%%str:~%len%,1%%
  12. set /a len+=1
  13. if "%word%" equ "," (set /a nx+=1 & call :e)
  14. if not "%word%" equ "" (goto :c)
  15. set /a nx+=1
  16. call :e
  17. goto :o
  18. :e
  19. set /a sn=%len%-%s%-1
  20. call set n%nx%=%%str:~%s%,%sn%%%
  21. set /a s=%len%
  22. goto :eof
  23. ::::::::Get Original Numbers::::::::
  24. ::::::::Deal With Numbers::::::::
  25. :o
  26. set /a maxinc=(%nx%-1)/2
  27. set /a num=%nx%+1+%maxinc%
  28. for /l %%a in (%nx%,-1,1) do (set /a kk=%maxinc%+%%a & set /a n!kk!=!n%%a!)
  29. for /l %%b in (1,1,%maxinc%) do (
  30. (set /a n%%b=-214748320)
  31. )
  32. set /a var=1
  33. :n
  34. if %var% equ 1 (set /a m%var%=%maxinc%) else (set /a var2=%var%-1 & call :x)
  35. set /a i=!m%var%!+%maxinc%+1
  36. if !m%var%! equ 0 (goto :p) else (goto :m)
  37. :x
  38. set /a m%var%=!m%var2%!/2
  39. goto :eof
  40. :m
  41. set /a temporary=!n%i%!
  42. set /a j=%i%-!m%var%!
  43. :j
  44. if %temporary% lss !n%j%! (goto :ch)
  45. goto :z
  46. :ch
  47. set /a k=%j%+!m%var%!
  48. set /a n%k%=!n%j%!
  49. set /a j-=!m%var%!
  50. goto :j
  51. :z
  52. set /a k=%j%+!m%var%!
  53. set /a n%k%=%temporary%
  54. set /a i+=1
  55. if %i% lss %num% (goto :m) else (set /a var+=1 & goto :n)
  56. ::::::::Deal With Numbers::::::::
  57. ::::::::Print The Result::::::::
  58. :p
  59. set /a qi=%maxinc%+1
  60. set /a zhi=%nx%+%maxinc%
  61. for /l %%c in (%qi%,1,%zhi%) do (set str2=!str2!!n%%c! )
  62. echo.
  63. echo The numbers after sorting are:
  64. echo !str2!
  65. echo.
  66. echo Press Any Key To Exit...
  67. pause>nul
  68. goto :eof
  69. ::::::::Print The Result::::::::
  70. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::s11ss
  71. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2007-9-15
复制代码
快速排序
http://www.cn-dos.net/forum/viewthread.php?tid=33602
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :::::::::::::::::::::::::::::::::::::::::Quick Sort:::::::::::::::::::::::::::::::::::::::::
  4. ::::::::Get Original Numbers::::::::
  5. echo Please input some numbers separated from "," , like 2007,9,14,88:
  6. set /a s=0
  7. set /p str=
  8. set /a len=0
  9. set /a nx=0
  10. :c
  11. call set word=%%str:~%len%,1%%
  12. set /a len+=1
  13. if "%word%" equ "," (set /a nx+=1 & call :e)
  14. if not "%word%" equ "" (goto :c)
  15. set /a nx+=1
  16. call :e
  17. goto :o
  18. :e
  19. set /a sn=%len%-%s%-1
  20. call set n%nx%=%%str:~%s%,%sn%%%
  21. set /a s=%len%
  22. goto :eof
  23. ::::::::Get Original Numbers::::::::
  24. ::::::::Deal With Numbers::::::::
  25. :o
  26. call :oo 1 %nx%
  27. goto :p
  28. :oo
  29. set /a aa=%1
  30. set /a bb=%2
  31. if %aa% lss %bb% (
  32.         call :partition %aa% %bb%
  33.         set /a jj=!i!-1
  34.         call :oo %aa% !jj!
  35.         set /a ii=!i!+1
  36.         call :oo !ii! %bb%
  37.         )
  38. goto :eof
  39. :partition
  40. set /a i=%1
  41. set /a j=%2
  42. set /a temporary=!n%i%!
  43. :cir
  44. :cr2l
  45. if %temporary% leq !n%j%! (
  46.         if %i% lss %j% (set /a j-=1 && goto :cr2l)
  47. )
  48. if %i% lss %j% (set /a n%i%=!n%j%! & set /a i+=1)
  49. :cl2r
  50. if %temporary% geq !n%i%! (
  51.         if %i% lss %j% (set /a i+=1 && goto :cl2r)
  52. )
  53. if %i% lss %j% (set /a n%j%=!n%i%! & set /a j-=1)
  54. if not %i% equ %j% goto :cir
  55. set /a n%i%=%temporary%
  56. goto :eof
  57. ::::::::Deal With Numbers::::::::
  58. ::::::::Print The Result::::::::
  59. :p
  60. for /l %%c in (1,1,%nx%) do (set str2=!str2!!n%%c! )
  61. echo.
  62. echo The numbers after sorting are:
  63. echo !str2!
  64. echo.
  65. echo Press Any Key To Exit...
  66. pause>nul
  67. goto :eof
  68. ::::::::Print The Result::::::::
  69. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::s11ss
  70. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2007-9-16
复制代码
直接选择排序
http://www.cn-dos.net/forum/viewthread.php?tid=33609
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :::::::::::::::::::::::::::::::::::::::::Straight Selection Sort:::::::::::::::::::::::::::::::::::::::::
  4. ::::::::Get Original Numbers::::::::
  5. echo Please input some numbers separated from "," , like 2007,9,14,88:
  6. set /a s=0
  7. set /p str=
  8. set /a len=0
  9. set /a nx=0
  10. :c
  11. call set word=%%str:~%len%,1%%
  12. set /a len+=1
  13. if "%word%" equ "," (set /a nx+=1 & call :e)
  14. if not "%word%" equ "" (goto :c)
  15. set /a nx+=1
  16. call :e
  17. goto :o
  18. :e
  19. set /a sn=%len%-%s%-1
  20. call set n%nx%=%%str:~%s%,%sn%%%
  21. set /a s=%len%
  22. goto :eof
  23. ::::::::Get Original Numbers::::::::
  24. ::::::::Deal With Numbers::::::::
  25. :o
  26. set /a i=1
  27. :ooo
  28. set /a k=%i%
  29. set /a j=%i%+1
  30. :oo
  31. if !n%j%! lss !n%k%! set /a k=%j%
  32. set /a j+=1
  33. if %j% leq %nx% goto :oo
  34. if %k% neq %i% (
  35.         set /a temporary=!n%i%!
  36.         set /a n%i%=!n%k%!
  37.         set /a n%k%=!temporary!
  38. )
  39. set /a i+=1
  40. if %i% lss %nx% goto :ooo
  41. ::::::::Deal With Numbers::::::::
  42. ::::::::Print The Result::::::::
  43. :p
  44. for /l %%c in (1,1,%nx%) do (set str2=!str2!!n%%c! )
  45. echo.
  46. echo The numbers after sorting are:
  47. echo !str2!
  48. echo.
  49. echo Press Any Key To Exit...
  50. pause>nul
  51. goto :eof
  52. ::::::::Print The Result::::::::
  53. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::s11ss
  54. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2007-9-16
复制代码
堆排序
http://www.cn-dos.net/forum/viewthread.php?tid=33623
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :::::::::::::::::::::::::::::::::::::::::Heap Sort:::::::::::::::::::::::::::::::::::::::::
  4. ::::::::Get Original Numbers::::::::
  5. echo Please input some numbers separated from "," , like 2007,9,14,88:
  6. set /a s=0
  7. set /p str=
  8. set /a len=0
  9. set /a nx=0
  10. :c
  11. call set word=%%str:~%len%,1%%
  12. set /a len+=1
  13. if "%word%" equ "," (set /a nx+=1 & call :e)
  14. if not "%word%" equ "" (goto :c)
  15. set /a nx+=1
  16. call :e
  17. goto :o
  18. :e
  19. set /a sn=%len%-%s%-1
  20. call set n%nx%=%%str:~%s%,%sn%%%
  21. set /a s=%len%
  22. goto :eof
  23. ::::::::Get Original Numbers::::::::
  24. ::::::::Deal With Numbers::::::::
  25. :o
  26. set /a iv=%nx%/2
  27. :v
  28. call :sift %iv% %nx%
  29. set /a iv-=1
  30. if %iv% geq 1 goto :v
  31. set /a iv=%nx%
  32. :b
  33. set /a tmpr=!n1!
  34. set /a n1=!n%iv%!
  35. set /a n%iv%=%tmpr%
  36. set /a iii=%iv%-1
  37. call :sift 1 %iii%
  38. set /a iv-=1
  39. if %iv% geq 2 goto :b
  40. goto :p
  41. :sift
  42. set /a i=%1
  43. set /a ww=%2
  44. :oo
  45. set /a t=!n%i%!
  46. set /a j=2*%i%
  47. :ooo
  48. if not %j% leq %ww% goto :eof
  49. if %j% lss %ww% (
  50.         set /a k=%j%+1
  51.         if !n%j%! lss !n%k%! (set /a j+=1)
  52. )
  53. if !t! lss !n%j%! (
  54.         set /a n%i%=!n%j%!
  55.         set /a i=%j%
  56.         set /a j=2*!i!
  57. ) else (goto :oooo)
  58. set /a n%i%=%t%
  59. if %j% leq %ww% goto :ooo
  60. goto :eof
  61. :oooo
  62. set /a n!i!=%t%
  63. goto :eof
  64. ::::::::Deal With Numbers::::::::
  65. ::::::::Print The Result::::::::
  66. :p
  67. for /l %%c in (1,1,%nx%) do (set str2=!str2!!n%%c! )
  68. echo.
  69. echo The numbers after sorting are:
  70. echo !str2!
  71. echo.
  72. echo Press Any Key To Exit...
  73. pause>nul
  74. goto :eof
  75. ::::::::Print The Result::::::::
  76. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::s11ss
  77. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2007-9-16
复制代码
起泡排序
http://www.cn-dos.net/forum/viewthread.php?tid=33595
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :::::::::::::::::::::::::::::::::::::::::Bubble Sort:::::::::::::::::::::::::::::::::::::::::
  4. ::::::::Get Original Numbers::::::::
  5. echo Please input some numbers separated from "," , like 2007,9,14,88:
  6. set /a s=0
  7. set /p str=
  8. set /a len=0
  9. set /a nx=0
  10. :c
  11. call set word=%%str:~%len%,1%%
  12. set /a len+=1
  13. if "%word%" equ "," (set /a nx+=1 & call :e)
  14. if not "%word%" equ "" (goto :c)
  15. set /a nx+=1
  16. call :e
  17. goto :o
  18. :e
  19. set /a sn=%len%-%s%-1
  20. call set n%nx%=%%str:~%s%,%sn%%%
  21. set /a s=%len%
  22. goto :eof
  23. ::::::::Get Original Numbers::::::::
  24. ::::::::Deal With Numbers::::::::
  25. :o
  26. set /a i=1
  27. :q
  28. set changed=False
  29. set /a j=%nx%
  30. :v
  31. set /a k=%j%-1
  32. if !n%k%! gtr !n%j%! (
  33.         set /a temporary=!n%k%!
  34.         set /a n%k%=!n%j%!
  35.         set /a n%j%=!temporary!
  36.         set changed=True
  37. )
  38. set /a j-=1
  39. if %j% geq %i% (
  40.         if not %j% equ 1 (
  41.                 goto :v
  42.                                          )
  43.                            )
  44. if %changed% equ False goto :p
  45. set /a i+=1
  46. if %i% lss %nx% goto :q
  47. ::::::::Deal With Numbers::::::::
  48. ::::::::Print The Result::::::::
  49. :p
  50. ::set /a qi=%maxinc%+1
  51. ::set /a zhi=%nx%+%maxinc%
  52. for /l %%c in (1,1,%nx%) do (set str2=!str2!!n%%c! )
  53. echo.
  54. echo The numbers after sorting are:
  55. echo !str2!
  56. echo.
  57. echo Press Any Key To Exit...
  58. pause>nul
  59. goto :eof
  60. ::::::::Print The Result::::::::
  61. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::s11ss
  62. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2007-9-15
复制代码
VBS版各种排序
http://www.cn-dos.net/forum/viewthread.php?tid=34530
  1. ''''''''      排序      ''''''''
  2. ''''''''s11ss 2007-10-18''''''''
  3. option explicit
  4. '接收输入:
  5. dim s,r,n,i
  6. s=inputbox(vbcrlf&vbcrlf&"以空格隔开:","请输入一组数:","2007 10 18 21 15")
  7. if s="" then wscript.quit
  8. r=split(s," ")
  9. n=ubound(r)
  10.         '把字符串转换为Double 子类型:
  11. for i=0 to n
  12.         r(i)=cdbl(r(i))
  13. next
  14. '快速排序方法调用:
  15. quicksort r,0,n
  16. '其它排序方法的调用:
  17. 'insertsort r
  18. 'shellsort r
  19. 'bubblesort r
  20. 'selectsort r
  21. 'heapsort r
  22. '输出结果:
  23. inputbox vbcrlf&vbcrlf&"按升序排列是:","结果",join(r," ")
  24. '各种排序子过程自定义:
  25. '直接插入排序:
  26. sub insertsort(r)
  27.         dim i,n,t,j
  28.         n=ubound(r)
  29.         for i=1 to n'依次插入r(1),r(2),...,r(n)
  30.                 t=r(i)
  31.                 j=i-1
  32.                 do while t<r(j)'查找r(i)的插入位置
  33.                         r(j+1)=r(j)'将大于r(i)的数后移
  34.                         j=j-1
  35.                         if j=-1 then exit do
  36.                 loop
  37.                 r(j+1)=t'插入r(i)
  38.         next
  39. end sub
  40. '希尔排序:
  41. sub shellsort(r)
  42.                 '设置增量序列:
  43.         dim i,d(),n,t,k,h,j
  44.         n=ubound(r)
  45.         i=0
  46.         redim d(n)
  47.         d(i)=fix(n/2)
  48.         do until d(i)=1
  49.                 t=d(i)
  50.                 i=i+1
  51.                 d(i)=fix(t/2)
  52.         loop
  53.                 '排序:
  54.         k=0
  55.         do
  56.                 h=d(k)'取本趟增量
  57.                 for i=h to n'r(h)到r(n)插入当前有序区
  58.                         t=r(i)'保存待插入数
  59.                         j=i-h
  60.                         do while t<r(j)'查找正确的插入位置
  61.                                 r(j+h)=r(j)'后移
  62.                                 j=j-h'得到前一数的位置
  63.                                 if j<0 then exit do
  64.                         loop
  65.                         r(j+h)=t'插入r(i)
  66.                 next'本趟排序完成
  67.                 k=k+1
  68.         loop while h<>1
  69. end sub
  70. '冒泡排序:
  71. sub bubblesort(r)
  72.         dim i,n,noswap,j,t
  73.         n=ubound(r)
  74.         for i=0 to n-1'做n趟排序
  75.                 noswap=True'置未交换标志
  76.                 for j=n-1 to i step -1'从下往上扫描
  77.                         if r(j+1)<r(j) then'交换
  78.                                 t=r(j)
  79.                                 r(j)=r(j+1)
  80.                                 r(j+1)=t
  81.                                 noswap=False
  82.                         end if
  83.                 next
  84.                 if noswap then exit for'本趟排序中未发生交换则终止算法
  85.         next
  86. end sub
  87. '快速排序:
  88.         '划分:
  89. function partition(r,l,h)
  90.         dim i,j,t
  91.         i=l
  92.         j=h
  93.         t=r(i)'初始化,t为基准
  94.         do
  95.                 while r(j)>=t and i<j
  96.                         j=j-1'从右向左扫描,查找第1个小于t的数
  97.                 wend
  98.                 if i<j then
  99.                         r(i)=r(j)'交换r(i)和r(j)
  100.                         i=i+1
  101.                 end if
  102.                 while r(i)<=t and i<j
  103.                         i=i+1'从左向右扫描,查找第1个大于t的数
  104.                 wend
  105.                 if i<j then
  106.                         r(j)=r(i)'交换r(i)和r(j)
  107.                         j=j-1
  108.                 end if               
  109.         loop while i<>j
  110.         r(i)=t'基准t已被最后定位
  111.         partition=i
  112. end function
  113.         '排序:
  114. sub quicksort(r,s1,t1)
  115.         dim i
  116.         if s1<t1 then'只有一个数或无数时无须排序
  117.                 i=partition(r,s1,t1)'对r(s1)到r(t1)做划分
  118.                 quicksort r,s1,i-1'递归处理左区间
  119.                 quicksort r,i+1,t1'递归处理右区间
  120.         end if
  121. end sub
  122. '直接选择排序:
  123. sub selectsort(r)
  124.         dim i,n,k,j,t
  125.         n=ubound(r)
  126.         for i=0 to n-1'做n趟排序
  127.                 k=i
  128.                 for j=i+1 to n'在当前无序区选最小的数r(k)
  129.                         if r(j)<r(k) then k=j
  130.                 next
  131.                 if k<>i then
  132.                         t=r(i)
  133.                         r(i)=r(k)
  134.                         r(k)=t
  135.                 end if
  136.         next
  137. end sub
  138. '堆排序:
  139.         '筛选:
  140. sub sift(r,i,m)'以r(i)为根的完全二叉树构成堆
  141.         dim t,j
  142.         t=r(i)
  143.         j=2*i
  144.         do while j<=m'j<=m,r(2*i)是r(i)的左孩子
  145.                 if j<m then
  146.                         if r(j)<r(j+1) then j=j+1'j指向r(i)的右孩子
  147.                 end if
  148.                 if t<r(j) then'孩子节点的数较大
  149.                         r(i)=r(j)'将r(j)换到双亲位置上
  150.                         i=j'修改当前被调整节点
  151.                         j=2*i
  152.                 else
  153.                         exit do'调整完毕,退出循环
  154.                 end if
  155.         loop
  156.         r(i)=t'最初被调整节点放入正确位置
  157. end sub
  158.         '排序:
  159. sub heapsort(r)
  160.         dim i,n,t
  161.         n=ubound(r)
  162.         for i=fix(n/2) to 0 step -1'建初始堆
  163.                 sift r,i,n
  164.         next
  165.         for i=n to 0 step -1'进行n+1趟排序
  166.                 t=r(0)'当前堆顶数和最后一个数交换
  167.                 r(0)=r(i)
  168.                 r(i)=t
  169.                 sift r,0,i-1'r(0)到r(i-1)重建成堆
  170.         next
  171. end sub
复制代码

作者: tyc    时间: 2009-4-17 15:42     标题: re batcher

我不屑抄别人的代码。。。。。。。。。。。。。
小学生信息学竞赛必须掌握前三种,后四种是中学生要掌握的
象杨辉三角,约瑟夫问题等是小学生掌握的
n阶魔阵问题是初中生要掌握的
你们版主觉的很历害,其实优秀的初中生,如defansive这样的就会做的
但是中学生的题目我很多是做不出来的

[ 本帖最后由 tyc 于 2009-4-17 15:51 编辑 ]
作者: tyc    时间: 2009-4-17 15:58     标题: rebatcher

你动不动就封人家贴子,动不动就说抄人家的,所以你该被很多人骂!知道为什么?因为你伤人自尊,打击别人的学习积极性!

[ 本帖最后由 tyc 于 2009-4-17 16:27 编辑 ]
作者: Batcher    时间: 2009-4-17 16:07     标题: 回复 5楼 的帖子

2楼说的很明确,正是因为不知道真实情况,才分了两种情况询问的。
请问哪句话打击了你的积极性?你认为论坛管理人员在想表达2楼那句话的时候应该采取何种措施才能不打击你的积极性呢?
关于说我“动不动就封人家贴子”,请问你认为我封哪个帖子违反了本论坛的规定?请向管理员投诉,相信管理员能够秉公执法。如果没有真凭实据,我将投诉你污蔑他人。
作者: Batcher    时间: 2009-4-17 16:11     标题: 回复 4楼 的帖子

那就说明是原创了,非常感谢分享了。

哦对了,我不是版主。至于版主们是否认为会排序算法的人就算“很历害”,我也不敢妄自揣测。就我个人而言,小学生、初中生能够掌握这些排序算法,我感到非常钦佩并自叹佛如。
作者: 随风    时间: 2009-4-17 16:17

不知楼主是原创还是转帖。如果是原创,当加分鼓励;如果是转帖,望注明出处。

这句话看不出有伤人自尊,打击别人的学习积极性的地方啊。
tyc 会员看来对batcher成见很深啊,但在论坛发表
你动不动就封人家贴子,动不动就说抄人家的,所以你该被很多人骂!知道为什么?因为你伤人自尊,打击别人的学习积极性!

这样的言论不太合适吧。
关于用批处理数字排序,各大论坛多年前以有很多人讨论过,相关代码早以产生。
而本论坛向来尊重原创,所以作为管理员对该主题进行提醒应该是职责内的事
至于你说的小学生、中学生该掌握的,似乎和批处理没有必然联系吧?
batcher对你的提醒并不是因为你的代码技术含量低,而是因为该类代码以出现太多。
就我个人而言,小学生、初中生能够掌握这些排序算法,我也是非常感到非常钦佩并自叹佛如。

[ 本帖最后由 随风 于 2009-4-17 16:19 编辑 ]
作者: sjzong    时间: 2009-4-20 21:33

哦!还有这么多种排序!!学习
作者: 小勇12    时间: 2009-4-20 21:56

真牛。
哈哈
基数排序总不能用批处理写了啥
作者: wc726842270    时间: 2011-2-23 15:44

经典,可惜仅用VBS写过冒泡排序,学习了
作者: wslqy    时间: 2011-3-20 13:28

楼主辛苦了,学习学习下先
作者: 2010sftv    时间: 2011-3-20 18:31

进来学习一下算法。
作者: wangqi0077    时间: 2011-5-22 16:44

这些个东西,,能不能详细分开了讲讲原理等东西,,,新手表示,完全不知道是什么.
作者: chris521crystal    时间: 2011-6-1 18:38

@echo off
setlocal enabledelayedexpansion
::选择排序法
echo 共输入10个数
for /l %%i in (1,1,10) do (
set /p a_%%i=请输入%%i个数
set str=!str! !a_%%i!
)
echo %str%
for /l %%i in (1,1,10) do (
set /a b=%%i+1
for /l %%j in (!b!,1,10) do (
   if !a_%%i! gtr !a_%%j! (
      set /a t=a_%%i
      set /a a_%%i=a_%%j
      set /a a_%%j=t
    )
)
)
for /l %%i in (1,1,10) do (
set str1=!str1! !a_%%i!
)
echo %str1%
pause>nul

请问这行“set str=!str! !a_%%i!”命令中的“!str! !a_%%i!”
是什么意思啊 ?为什么有2个变量没用其他运算符,而是空格
作者: plp626    时间: 2012-3-23 13:30

  1. @echo off|| 希尔排序练习
  2. setlocal enabledelayedexpansion
  3. ::获得256个随机数
  4. set n=255&for /l %%a in (0 1 !n!)do set/a a[%%a]=!random!
  5. ::获取制表符
  6. for /f "delims=U" %%a in ('cmd/u/cecho 唉')do set tab=%%a
  7. set x=0
  8. for /l %%a in (0 1 %n%)do (
  9. set/p=!a[%%a]!!tab!<nul&set/a x+=1,y=x%%8&if !y!==0 echo;
  10. )
  11. echo;---------------
  12. call:shellsort a n
  13. set x=0
  14. for /l %%a in (0 1 %n%)do (
  15. set/p=!a[%%a]!!tab!<nul&set/a x+=1,y=x%%8&if !y!==0 echo;
  16. )
  17. pause
  18. :shellsort <arrname> <arrsize> // code by plp
  19. for %%a in (132 57 23 9 4 1)do (
  20.     for /l %%b in (%%a 1 !%2!)do (set/a x=%%b-%%a
  21.         for /l %%c in (!x! -%%a 0)do (set/a jj=%%c+%%a
  22.             for /f "tokens=1-2" %%A in ("a[%%c] a[!jj!] ")do (
  23.                 if !%%A! gtr !%%B! set/ap=%1[%%c],%1[%%c]=%1[!jj!],%1[!jj!]=p
  24.             )
  25.         )
  26.     )
  27. )
  28. goto:eof
复制代码





欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2