Solved

quick sort

Posted on 2007-03-26
4
400 Views
Last Modified: 2012-06-21
i attempt to alter the quick sort code to choose the pivot as median of first, middle and last element,but i couldnot achieve my aim. my code is:
template<class type>
void quick_sort(type* darr,int size, int lb, int ub)
{
int a;              // key holder //
int up, down;
int temp;           // temporary variable, used in swapping //

if (lb >= ub)
    return;

a = darr[(lb+ub)/2];
up = ub;
down = lb;

while (down < up)
{
    while (darr[down] <= a)         // scan the keys from left to right //
        down++;
    while (darr[up] > a)             // scan the keys from right to left //
        up--;
    if (down < up)
    {
        temp = darr[down];          /* interchange records */
      darr[down] = darr[up];
        darr[up] = temp;
    }
}

darr[lb] = darr[up];                /* interchange records */
darr[up] = a;

quick_sort(darr,size, lb, up-1);         /* recursive call - sort first subtable */
quick_sort(darr, size,up+1, ub);         /* recursive call - sort second subtable */

}

how to choose pivot in the way i desire?
0
Comment
Question by:btocakci
4 Comments
 
LVL 86

Assisted Solution

by:jkr
jkr earned 100 total points
ID: 18795545
Try

a = darr[lb+(lb+ub)/2];

instead. Others even set it to "a = darr[lb];", see e.g. the examples at http://en.wikipedia.org/wiki/Quicksort
0
 
LVL 15

Assisted Solution

by:efn
efn earned 150 total points
ID: 18796447
You need to write some code to find the median value.  You don't have any now.  You could write a big nested if statement to find it, or you could put the three values in an array, sort them, and take the second, whichever you find easiest.

Although your current code takes the pivot from the middle element, the post-loop code is written for the pivot being the first element.  You will have to fix this too.  After you find the median, you could save where it came from and use that after the loop to do the right exchange, but it will be simpler to swap the median with the first element before the loop and keep the code you have.
0
 
LVL 39

Accepted Solution

by:
itsmeandnobodyelse earned 250 total points
ID: 18798012
Finding the median costs extra time that will slow down sorting in most cases. You may consider to take a random index between lb and ub instead:

    pivot = lb + rand()%(ub-lb);


To avoid the rand() overhead as well you may use a static array of random numbers instead:

   static int randarr = { 1234, 623, 7621, 9, 2800, ... };
   ...

   pivot = lb + (randarr[(ub l lb)%(sizeof(randarr)/sizeof(int))] % (ub - lb));
0

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Templates For Beginners Or How To Encourage The Compiler To Work For You Introduction This tutorial is targeted at the reader who is, perhaps, familiar with the basics of C++ but would prefer a little slower introduction to the more ad…
This article is meant to give a basic understanding of how to use R Sweave as a way to merge LaTeX and R code seamlessly into one presentable document.
The goal of this video is to provide viewers with basic examples to understand and use conditional statements in the C programming language.
The goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…

810 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question