Jump to content
gononono64

[Help] Quicksorting 2d Array by String Comparison Recusion Exceeded

Recommended Posts

gononono64

Hey there,

I'm having some issues quick-sorting my 2d array imported from a database. Im trying to sort the array based on the name that would be returned in $array[$n][2]. The code i posted works for smaller arrays but for some reason when i try to sort my imported array (around 9000 indexes), I get "Recursion level has been exceeded". I understand that this is maybe due to lack of returns but i couldn't find an ideal spot to stick em and again it seems to work with smaller bits of code. Could it be that 9000 is too much?

I would normally just trial and error it until i figured it out but due to the length of time to load and buffer my array it's become too time consuming. Really I'm just hoping there is a quick fix that someone with more experience happens to know.

Thank you

 

;;---------------------------------------------This Works----------------------------------------------------

Local $a[7][2] = [ _
        ["1", "asdfashks"], _
        ["2", "SubStrlkghjing1"], _
        ["3", "jdfghjsergh"], _
        ["4", "nertynert"], _
        ["5", "cvbncvjkrt"], _
        ["6", "avbncvjkrt"], _
        ["7", "oytuoyuop"]]
Quicksort($a,1,0,6)
_ArrayDisplay($a)

;;------------------------------------------This Does Not---------------------------------------------------------

Quicksort($aLargeData, 1, 0, Ubound($aLargeData) - 1)
_ArrayDisplay($aLargeData)


;;----------------------------------------Quicksort Function------------------------------------------------------
Func Quicksort(ByRef $Array, $secondIndex, $First, $Last)
    Local $pivot, $i, $j, $temp
    If $First < $Last Then
        $pivot = $First
        $i = $First
        $j = $Last
        While ($i < $j)
            While (StringCompare($Array[$i][$secondIndex], $Array[$pivot][$secondIndex]) <= 0) And ($i < $Last)
                $i += 1
            WEnd
            While (StringCompare($Array[$j][$secondIndex], $Array[$pivot][$secondIndex]) > 0)
                $j -= 1
            WEnd
            If ($i < $j) Then _ArraySwap($Array, $i, $j)
            _ArraySwap($Array,$pivot,$j)
            Quicksort($Array, $secondIndex, $First,$j-1)
            Quicksort($Array, $secondIndex, $j+1,$Last)
        WEnd
    EndIf
EndFunc

 

Share this post


Link to post
Share on other sites
spudw2k

I believe functions will return 0 at the conclusion of the function if a return isn't specified, though I can't remember where I read/learned that.

Give this a read if you haven't already.
https://www.autoitscript.com/wiki/Recursion#A_way_of_avoiding_of_recursion

 

Share this post


Link to post
Share on other sites
jchd

Sideways question: can't you just use an order by clause when exporting data from the DB engine?

 


This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Share this post


Link to post
Share on other sites
gononono64

I need to be able to sort the array in multiple ways after it is buffered. otherwise it would take an eternity to search in the "app"

Share this post


Link to post
Share on other sites
czardas

What happens if you use _ArraySort() instead of the QuickSort() function you posted? Using the same array, could you tell me if the following also produces a recursion error? - Thanks. (ArrayWorkshop.au3 can be found in my signature)

#include 'ArrayWorkshop.au3'

Local $aArray ; replace with your array

_ArraySortXD($aArray, Default, Default, Default, 0, 1)

 

Share this post


Link to post
Share on other sites
gononono64
1 hour ago, czardas said:

What happens if you use _ArraySort() instead of the QuickSort() function you posted? Using the same array, could you tell me if the following also produces a recursion error? - Thanks. (ArrayWorkshop.au3 can be found in my signature)

#include 'ArrayWorkshop.au3'

Local $aArray ; replace with your array

_ArraySortXD($aArray, Default, Default, Default, 0, 1)

 

Yay it works!!!

Thank you so much. Would u mind if i used the functions from ur file?

Edited by gononono64
  • Like 1

Share this post


Link to post
Share on other sites
czardas

Thanks for the report. We now know that there is a flaw in the logic in the QuickSort() function you posted (probably a comparison failure). Of course you can use my functions. If you need any help with them, let me know.

Did you test the standard _ArraySort() function?

Edited by czardas
  • Like 1

Share this post


Link to post
Share on other sites
gononono64
18 minutes ago, czardas said:

Thanks for the report. We now know that there is a flaw in the logic in the QuickSort() function you posted (probably a comparison failure). Of course you can use my functions. If you need any help with them, let me know.

Did you test the standard _ArraySort() function?

Yes it didnt suit my needs. Thank you and much appreciated :D

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • PleaseHelpMEIWillLoveyou
      By PleaseHelpMEIWillLoveyou
      Is there a way to use a custom terminal or something from my pc and run a script on another pc.
      please let me know if its possible
      (not for anything bad just for a project im working on)
    • kelso
      By kelso
      Hello Guru's,
       
      I'm trying to write an autoit script to select from the dropdown list as you see in the attached picture. 
      I read the help page for _IEFormElementOptionSelect, but I cannot grasp how to correlate that with the source code that I'm seeing. any suggestions?

    • SC0U7
      By SC0U7
      Hello i have a text file which contain over 600KB of BASE64 strings like :
      TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...
      Now what i need is divide this long string as autoit variable each max lenght (4000characters per line) example:
      Local $var
      $var &=  TVqQAAMAAAAEAAA..
      $var &=  VbAmejwqqqAACEE..
      and then how to i add encrypt function on every line ? how to i can xor it? example final will be :
      $var &=  XorEnc(TVqQAAMAAAAEAAA..)
      $var &=  XorEncVbAmejwqqqAACEE..)
       
      Thanks for any help and ideas 
    • VollachR
      By VollachR
      Hi,
      I'm looking for a way to take a number value from a Row2 of a 2D array and according to this check if files that appear in rows 3-11 in the array exists.
      For example, if the number in Row2 is 5 I need to check for the files in Row 3-6 only, if it is 6 than rows 3-7 and so on.
      I thought on using a FOR loop but I have very little experience with those.
      Can you suggest the best way to do what I need?
      BTW, the files in Rows 3-11 will usually have blank value for any row above the number in Row2 (e.g. Row2 = 5 so Rows3-6 will have values but 8-11 be empty), The values I need are in Column 1 of the array, the name of the key from the INI file that the array was created from is in Column 0.
      Full Example:
      Row2 of Array:
      Col0 = Games# - Col1 = 5
      Rows3-6
      Col0 = Exe2 - Col1 = Path To File
      Col0 = Exe3 - Col1 = Path To File
      Col0 = Exe4 - Col1 = Path To File
      Col0 = Exe5 - Col1 = Path To File
      I need that if Row2 is 5 to check these above for rows if the file exists, if it was 6 then the next row as well and so on up until number 10 in Row2 as it can't go above 10.
      So basically for whatever number in Row2 from 2-10 need to check 1-9 rows from 3-11 to see if the files in Col1 exists and if any of them don't exist it should call a function that shows an error message.
      I'm pretty sure I have the first line of the for look correct:
      For $i = 1 To $aAIO[2][1] Just not sure how to continue from there, also not sure if $i should be equal 1 or 2.
      Help will be appreciated.
    • VollachR
      By VollachR
      Hi,
      I've written a specialty INI file editor for a specific set of INI files related to a bigger script I'm working on.
      I'm trying to create a verification script that checks the ini files structure and format and gives an error if they are not in expected format.
      What I did so far is create a couple of custom arrays, each with the list of Sections expected in the files and I use IniReadSectionNames in order to read the sections from the selected INI file and compare it to the array.
      It works fine, excepts it only gives an error if one or more of the sections in the custom array is missing, if they all exist but there are other additional sections that shouldn't be there it doesn't give an error and continue to open the editor screen.
      Here are the relevant part of my script:
      The Custom Verification Arrays:
      ;Creating Arrays for INI Verification Global $aSettingsVerify[7] $aSettingsVerify[1] = "Conversion" $aSettingsVerify[2] = "AIO" $aSettingsVerify[3] = "Data" $aSettingsVerify[4] = "Redist" $aSettingsVerify[5] = "Split" $aSettingsVerify[6] = "Autorun" Global $aDataVerify[6] $aDataVerify[1] = "Compression" $aDataVerify[2] = "Exclude" $aDataVerify[3] = "LangExclude" $aDataVerify[4] = "PreCommands" $aDataVerify[5] = "PostCommands" The IniReadSectionNames verification part:
      Case $OK If StringInStr($ActiveConfig, "Settings.ini") Then $CheckArray1 = IniReadSectionNames($ActiveConfig) $CheckArray2 = _ArrayCompare($aSettingsVerify, $CheckArray1) $CheckArray3 = UBound($CheckArray2, 1) If $CheckArray3 = 1 Then GUIDelete($ConfigStart) SettingsGUI() EndIf If $CheckArray3 > 1 Then WrongIni() EndIf EndIf If StringInStr($ActiveConfig, "Data") Then $CheckArray1 = IniReadSectionNames($ActiveConfig) $CheckArray2 = _ArrayCompare($aDataVerify, $CheckArray1) $CheckArray3 = UBound($CheckArray2, 1) If $CheckArray3 = 1 Then GUIDelete($ConfigStart) DataGUI() EndIf If $CheckArray3 > 1 Then WrongIni() EndIf EndIf The Function that performs the compare: (Found it in another thread on this forums somewhere by using Google Search)
      ;Compares Imported INI file with the Verification array Func _ArrayCompare(ByRef $a1, ByRef $a2) Local $nOldSize = UBound($a2) Local $a3[$nOldSize], $nNewSize = $nOldSize For $i = 0 To UBound($a1) - 1 For $j = 0 To $nOldSize - 1 If Not $a3[$j] And ($a1[$i] = $a2[$j]) Then $a3[$j] = 1 $nNewSize -= 1 EndIf Next Next Local $a4[$nNewSize], $j = 0 For $i = 0 To $nOldSize - 1 If Not $a3[$i] Then $a4[$j] = $a2[$i] $j += 1 EndIf Next Return $a4 EndFunc ;==>_ArrayCompare  
      Any way to make a check if there are sections other than the ones in the Verification Array and produce an error?
      Thanks
×