Sign in to follow this  
Followers 0
rcmaehl

BubbleSort - A slower alternative to _ArraySort

1 post in this topic

#1 ·  Posted (edited)

Got Bored, and decided to write up BubbleSort from my early Prelude to Programming class in College.


Features:
BubbleSorting! Fast on small arrays, extremely slow on larger ones!
2 Dimesional Array Sorting (KINDA)! Sort 2 dimesional arrays!
83 Lines of Code you'll never use because _ArraySort is hundreds faster!

#include-once <AutoItConstants.au3>

; #FUNCTION# ====================================================================================================================
; Name ..........: BubbleSort
; Description ...: Sorts a 1 or 2 dimensional array using the BubbleSort Algorithm
; Syntax ........: BubbleSort($_aArray[, $_bAscending = True])
; Parameters ....: $_aArray             - [in/out] The 1 dimensional array to sort.
;                  $_bAscending         - [optional] Sort by increasing values. Default is True.
; Return values .: Success - Returns 1
;                  Failure - Returns 0 and sets @error:
;                  |1 = Invalid Array, sets @extented: (1, if not a valid array; 2, if not 1 or 2 dimesional)
;                  |2 = Invalid $_bAscending Flag
; Author ........: Robert C. Maehl (rcmaehl)
; Modified ......: 11/30/2015
; Remarks .......: To do: Complete Two Dimesional Array sorting ([first,first] = lowest, [last,last] = highest)
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func BubbleSort(ByRef $_aArray, $_bAscending = True)
    Local $_vReturn = Null
    Local $_bFinished = False
    If Not IsArray($_aArray) Then SetError(1,1,0)
    If UBound($_aArray, $UBOUND_DIMENSIONS) > 2 Then SetError(1,2,0)
    If Not IsBool($_bAscending) Then SetError(2,0,0)
    If $_vReturn = Null Then
        If UBound($_aArray, $UBOUND_DIMENSIONS) = 1 Then
            While Not $_bFinished
                $_bFinished = True
                $_iLoop = 0
                $_vTemp = 0
                If $_bAscending Then
                    For $_iLoop = 0 To UBound($_aArray) - 2
                        If $_aArray[$_iLoop] > $_aArray[$_iLoop + 1] Then
                            $_vTemp = $_aArray[$_iLoop]
                            $_aArray[$_iLoop] = $_aArray[$_iLoop + 1]
                            $_aArray[$_iLoop + 1] = $_vTemp
                            $_bFinished = False
                        EndIf
                    Next
                Else
                    For $_iLoop = 0 To UBound($_aArray) - 2
                        If $_aArray[$_iLoop] < $_aArray[$_iLoop + 1] Then
                            $_vTemp = $_aArray[$_iLoop]
                            $_aArray[$_iLoop] = $_aArray[$_iLoop + 1]
                            $_aArray[$_iLoop + 1] = $_vTemp
                            $_bFinished = False
                        EndIf
                    Next
                EndIf
            WEnd
        Else ; 2 Dimesional Sorting, Not Yet Complete. (Sort all rows & columns with [0,0] with smallest, and [last,last] with largest)
            $_iLoop1 = 0
            For $_iLoop1 = 0 To UBound($_aArray, $UBOUND_ROWS) - 1
                $_bFinished = False
                While Not $_bFinished
                    $_bFinished = True
                    $_iLoop2 = 0
                    $_vTemp = 0
                    If $_bAscending Then
                        For $_iLoop2 = 0 To UBound($_aArray, $UBOUND_COLUMNS) - 2
                            If $_aArray[$_iLoop1][$_iLoop2] > $_aArray[$_iLoop1][$_iLoop2 + 1] Then
                                $_vTemp = $_aArray[$_iLoop1][$_iLoop2]
                                $_aArray[$_iLoop1][$_iLoop2] = $_aArray[$_iLoop1][$_iLoop2 + 1]
                                $_aArray[$_iLoop1][$_iLoop2 + 1] = $_vTemp
                                $_bFinished = False
                            EndIf
                        Next
                    Else
                        For $_iLoop2 = 0 To UBound($_aArray, $UBOUND_COLUMNS) - 2
                            If $_aArray[$_iLoop1][$_iLoop2] < $_aArray[$_iLoop1][$_iLoop2 + 1] Then
                                $_vTemp = $_aArray[$_iLoop1][$_iLoop2]
                                $_aArray[$_iLoop1][$_iLoop2] = $_aArray[$_iLoop1][$_iLoop2 + 1]
                                $_aArray[$_iLoop1][$_iLoop2 + 1] = $_vTemp
                                $_bFinished = False
                            EndIf
                        Next
                    EndIf
                WEnd
            Next
        EndIf
    EndIf
EndFunc

 

Edited by rcmaehl
Update to #include-once

My UDFs are generally for me. If they aren't updated for a while, it means I'm not using them myself. As soon as I start using them again, they'll get updated.

MY PROJECTS


Active: IRC UDF, WindowEx UDF
Discontinued: GithubBubbleSort UDF

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
Sign in to follow this  
Followers 0