Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 4042002
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 20, 20262026-05-20T12:57:04+00:00 2026-05-20T12:57:04+00:00

I am trying to implement the simple variant of quicksort defined in Wikipedia .

  • 0

I am trying to implement the simple variant of quicksort defined in Wikipedia. However, it seems to me that local variables in an older recursive call are leaking to a later call. (My current interpretation.). Is this the case? Any workarounds?

Here’s the sample code

# Quick sort - Simple variant. Requires 0(n) extra store 
# Divide and conquer. Pick a pivot, compare elements to
# pivot generating two sublists; one greater than pivot 
# and the other less than pivot. Sort these two recursively.
# See http://en.wikipedia.org/wiki/Quicksort#Simple_version

function dump_array(arr_arg){

        arr_arg_len = length(arr_arg)
        RSEP = ORS;
        ORS=" ";
        dctr = 1; 
        # Do not use length(arr_arg) in place of arr_arg
        # It fails. The following doesn't work
        #while (dctr <= arr_arg_len){
        while (dctr <= arr_arg_len){
                print arr_arg[dctr]; 
                dctr++;
        }; 
        ORS = RSEP;
        print "\n";
}


function simple_quicksort(unsorted_str)
{

        # Unpack from the str - space separated
        print "******************************"
        print "Called with "unsorted_str
        # Split the space separated string into an array
        split(unsorted_str, unsorted_array, " ");

        array_len = length(unsorted_array);

        # No more sorting to be done. Break recursion
        if (array_len <= 1){
                print "Ending recursion with "unsorted_str
                return unsorted_str
        }
        # Pick a random value as pivot
        # index must not be 0
        idx = 0
        while (idx == 0){
                srand()
                idx = int(rand() * array_len)
        }
        pivot = unsorted_array[idx]
        if (debug >= 1){
                print "idx:"idx" pivot is: "pivot
        }

        num = 1;
        # we don't use the zero'th element,
        # this helps us declare an empty array
        # dunno any other method
        # we'll remove it anyway
        less_arr[0] = 0
        less_ctr = 1
        more_arr[0] = 0
        more_ctr = 1
        while (num <= array_len){ 
                # Skip pivot
                if (idx != num){
                        if (unsorted_array[num] <= pivot){
                                if (debug >= 1){
                                        print "Element less than pivot: "unsorted_array[num]
                                }
                                less_arr[less_ctr] = unsorted_array[num]
                                less_ctr++;
                        }else{
                                if (debug >= 1){
                                        print "Element more than pivot: "unsorted_array[num]
                                }
                                more_arr[more_ctr] = unsorted_array[num]
                                more_ctr++;
                        }
                }
                num++
        };
        # strip out the holder in idx 0
        delete less_arr[0]
        delete more_arr[0]
        if (debug >= 1){
                print "Less than pivot:"
                print dump_array(less_arr)
                print "More than pivot:"
                print dump_array(more_arr)
        }

        # Marshal array back to a string
        less_str=""
        less_length = length(less_arr)
        num = 1
        print "Less length: "less_length
        while (num <= less_length){
                less_str = less_str" "less_arr[num]     
                num++;
        }

        # same thing for more
        more_str=""
        more_length = length(more_arr) 
        num = 1
        while (num <= more_length){
                more_str = more_str" "more_arr[num]
                num++;
        }

        if (debug >= 1){
                print "Going for a recursive call with elements < pivot: "less_str
                print "Going for a recursive call with elements > pivot: "more_str
                print "pivot was: "pivot
        }

        # Tried to delete the local variables
        # Coz it seems like local vars are visible to recursed functions
        # Is this why it fails?
        delete less_arr
        delete more_arr
        delete unsorted_array
        print "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
        print ""

        return simple_quicksort(less_str) " "pivot" "simple_quicksort(more_str)


}

BEGIN{
        print "-- quick sort --"
}

{
        # print the unsorted objects
        print "Unsorted "NF" objects:\n"$0; 

        # We'll use a slightly different method,
        # Pass the $0 string to the sorter, let it split
        # it into an array, qsort that array, generate sub- 
        # strings and recursively qsort them

        #Simple version
        sorted = simple_quicksort($0)

}

END{
        print "Sorted "NF" objects"; 
        print "Sorted >>"sorted
}

A sample run:

echo 5 12 7 2 13719 28019 21444 30578 30647 | awk -f devel/andorian-blog/awk/sorting/quick_sort.awk -v debug=1
-- quick sort --
Unsorted 9 objects:
5 12 7 2 13719 28019 21444 30578 30647
******************************
Called with 5 12 7 2 13719 28019 21444 30578 30647
idx:1 pivot is: 5
Element more than pivot: 12
Element more than pivot: 7
Element less than pivot: 2
Element more than pivot: 13719
Element more than pivot: 28019
Element more than pivot: 21444
Element more than pivot: 30578
Element more than pivot: 30647
Less than pivot:
2 


More than pivot:
12 7 13719 28019 21444 30578 30647 


Less length: 1
Going for a recursive call with elements < pivot:  2
Going for a recursive call with elements > pivot:  12 7 13719 28019 21444 30578 30647
pivot was: 5
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

******************************
Called with  2
Ending recursion with  2
******************************
Called with  12 7 13719 28019 21444 30578 30647
idx:1 pivot is: 12
Element less than pivot: 7
Element more than pivot: 13719
Element more than pivot: 28019
Element more than pivot: 21444
Element more than pivot: 30578
Element more than pivot: 30647
Less than pivot:
7 


More than pivot:
13719 28019 21444 30578 30647 


Less length: 1
Going for a recursive call with elements < pivot:  7
Going for a recursive call with elements > pivot:  13719 28019 21444 30578 30647
pivot was: 12
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

******************************
Called with  7
Ending recursion with  7
******************************
Called with  13719 28019 21444 30578 30647
idx:3 pivot is: 21444
Element less than pivot: 13719
Element more than pivot: 28019
Element more than pivot: 30578
Element more than pivot: 30647
Less than pivot:
13719 


More than pivot:
28019 30578 30647 


Less length: 1
Going for a recursive call with elements < pivot:  13719
Going for a recursive call with elements > pivot:  28019 30578 30647
pivot was: 21444
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

******************************
Called with  13719
Ending recursion with  13719
******************************
Called with  28019 30578 30647
idx:1 pivot is: 28019
Element more than pivot: 30578
Element more than pivot: 30647
Less than pivot:



More than pivot:
30578 30647 


Less length: 0
Going for a recursive call with elements < pivot: 
Going for a recursive call with elements > pivot:  30578 30647
pivot was: 28019
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

******************************
Called with 
Ending recursion with 
******************************
Called with  30578 30647
idx:1 pivot is: 30578
Element more than pivot: 30647
Less than pivot:



More than pivot:
30647 


Less length: 0
Going for a recursive call with elements < pivot: 
Going for a recursive call with elements > pivot:  30647
pivot was: 30578
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

******************************
Called with 
Ending recursion with 
******************************
Called with  30647
Ending recursion with  30647
Sorted 9 objects
Sorted >> 2 5  7 12  13719 21444  28019  30578  30647

That run looks good. Compare it with the next one:

$ echo 5 12 7 2 13719 28019 21444 30578 30647 | awk -f devel/andorian-blog/awk/sorting/quick_sort.awk -v debug=1  
-- quick sort --
Unsorted 9 objects:
5 12 7 2 13719 28019 21444 30578 30647
******************************
Called with 5 12 7 2 13719 28019 21444 30578 30647
idx:6 pivot is: 28019
Element less than pivot: 5
Element less than pivot: 12
Element less than pivot: 7
Element less than pivot: 2
Element less than pivot: 13719
Element less than pivot: 21444
Element more than pivot: 30578
Element more than pivot: 30647
Less than pivot:
5 12 7 2 13719 21444 


More than pivot:
30578 30647 


Less length: 6
Going for a recursive call with elements < pivot:  5 12 7 2 13719 21444
Going for a recursive call with elements > pivot:  30578 30647
pivot was: 28019
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

******************************
Called with  5 12 7 2 13719 21444
idx:4 pivot is: 2
Element more than pivot: 5
Element more than pivot: 12
Element more than pivot: 7
Element more than pivot: 13719
Element more than pivot: 21444
Less than pivot:



More than pivot:
5 12 7 13719 21444 


Less length: 0
Going for a recursive call with elements < pivot: 
Going for a recursive call with elements > pivot:  5 12 7 13719 21444
pivot was: 2
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

******************************
Called with 
Ending recursion with 
******************************
Called with  5 12 7 13719 21444
idx:3 pivot is: 7
Element less than pivot: 5
Element more than pivot: 12
Element more than pivot: 13719
E    lement more than pivot: 21444
Less than pivot:
5 


More than pivot:
12 13719 21444 


Less length: 1
Going for a recursive call with elements < pivot:  5
Going for a recursive call with elements > pivot:  12 13719 21444
pivot was: 7
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

******************************
Called with  5
Ending recursion with  5
******************************
Called with  12 13719 21444
idx:2 pivot is: 13719
Element less than pivot: 12
Element more than pivot: 21444
Less than pivot:
1    2 


More than pivot:
21444 


Less length: 1
Going for a recursive call with elements < pivot:  12
Going for a recursive call with elements > pivot:  21444
pivot was: 13719
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

******************************
Called with  12
Ending recursion with  12
******************************
Called with  21444
Ending recursion with  21444
******************************
Called with  21444
Ending recursion with  21444
Sorted 9 objects
Sorted >> 2  5 7  12 13719  21444 13719  21444
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-20T12:57:04+00:00Added an answer on May 20, 2026 at 12:57 pm

    In AWK, all the variables you reference to in your functions are global variables. There is no such thing as “local variables”.
    However, function arguments in AWK behave like local variables in the sense they are “hidden” when a nested or recursive function is called.
    So you simply need to take all the “local variables” in your function and add them as extra arguments of your function.
    When you call the function you can omit these extra arguments.
    It is conventional to place some extra space between the arguments and the “local variables”, in order to document how your function is supposed to be used.
    This behavior and convention are documented on GAWK documentation: Function Definition Syntax.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I am trying to implement a simple client that connects to a give address.
I am trying to implement a simple C++ function that adds a node to
I was trying to implement a simple function that can concatenate any number of
I'm trying to implement a simple watermark on a text box that disappears when
I'm trying to implement a simple HTTP server in Android that handles POST requests,
I'm trying to implement simple continuous collision detection for my pong game however i'm
I am trying to implement a simple HashTable in Java that uses a Linked
I'm trying to implement a simple ActionLink that will delete records using ASP.NET MVC.
I am trying to implement simple program in Java that will be used to
When trying to implement a simple OpenGL application, I was surprised that while it

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.