Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. Sort Functions

Sort Functions

Scheduled Pinned Locked Moved C / C++ / MFC
c++databasedata-structuresquestion
17 Posts 13 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • B Babylon Lion

    So whenever a comparison like that is required, a bubble function is used, right?

    C Offline
    C Offline
    CPallini
    wrote on last edited by
    #6

    There's no bubble function, actually. From Wikipedia[^] : "The algorithm gets its name from the way smaller elements 'bubble' to the top of the list". :)

    If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
    This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
    [My articles]

    1 Reply Last reply
    0
    • D David Crow

      Babylon Lion wrote:

      Can you guys provide some explanation please?

      See here.

      "One man's wage rise is another man's price increase." - Harold Wilson

      "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

      "Man who follows car will be exhausted." - Confucius

      B Offline
      B Offline
      Babylon Lion
      wrote on last edited by
      #7

      thank you :)

      1 Reply Last reply
      0
      • D David Crow

        Babylon Lion wrote:

        Can you guys provide some explanation please?

        See here.

        "One man's wage rise is another man's price increase." - Harold Wilson

        "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

        "Man who follows car will be exhausted." - Confucius

        C Offline
        C Offline
        CurtainDog
        wrote on last edited by
        #8

        I may have gone mad but this is a selection sort surely... Edit: my hesitation is due to the fact that (as pointed out above) you never see these sorts of sorts in the wild because there are much better sorts of sorts.

        1 Reply Last reply
        0
        • B Babylon Lion

          So whenever a comparison like that is required, a bubble function is used, right?

          S Offline
          S Offline
          S Houghtelin
          wrote on last edited by
          #9

          Babylon Lion wrote:

          whenever a comparison like that is required, a bubble function is used, right?

          The bubble sort is not the most efficient method of sorting data as there is a lot of swapping going on. In a short list (array) it works fine and is quicker and easier to code. With a shorter list there really isn't too much loss of efficiency. This site provides a good visual demonstration of the different types of sorts http://www.sorting-algorithms.com/[^] As Superman states use the std::sort function if you can, although learning sort algorithms can be useful. Good luck!

          It was broke, so I fixed it.

          1 Reply Last reply
          0
          • B Babylon Lion

            Hi all, I have a working program that reads stocks symbols and values from a text file and do some operations on the data, and then it outputs the the data as two reports. The first report is sorted by stock symbols, and the other report is sorted by percent gain/loss. I'm having difficulties understating how these sort functions are doing the comparisons.. Can you guys provide some explanation please?

            //sorts the stocks naturally (stock symbol)
            template<class elemType>
            void listType<elemType>::sort(){
            int i, j;
            int min;
            elemType temp;

            for (i = 0; i <length; i++){
            	min = i;
            	for (j = i + 1; j < length; ++j)
            	   if (list\[j\] < list\[min\])
            		min = j;
            	temp = list\[i\];
            	list\[i\] = list\[min\];
            	list\[min\] = temp;
            }
            

            }

            //sorts the stocks by percent gain/loss
            void stockListType::sortByGain(){
            int i, j;
            int temp;
            indexByGain = new int[length];

            //Pre-populate the index array
            for(int c = 0; c < length; c++){
            	indexByGain\[c\] = c;
            }
            
            //Sort by the percentage change
            for (i = 0; i <length; i++){
            	for (j = i + 1; j < length; j++){
            	   if (list\[indexByGain\[j\]\].getPercentChange() > list\[indexByGain\[i\]\].getPercentChange()){
            			temp = indexByGain\[i\];
            			indexByGain\[i\] = indexByGain\[j\];
            			indexByGain\[j\] = temp;
            	   }
            	}
            }
            

            }

            D Offline
            D Offline
            DarthDana
            wrote on last edited by
            #10

            QuickSort is infinitely faster than a bubble sort. I use it exclusively. It recursively breaks the list up into smaller and smaller pieces. The resulting time-to-sort relative to the length of the list is linear instead of exponential. Found this from Googling QUICKSORT. There are many other sources of info out there.

            void swap(int *x,int *y)
            {
            int temp;
            temp = *x;
            *x = *y;
            *y = temp;
            }

            int choose_pivot(int i,int j )
            {
            return((i+j) /2);
            }

            void quicksort(int list[],int m,int n)
            {
            int key,i,j,k;
            if( m < n)
            {
            k = choose_pivot(m,n);
            swap(&list[m],&list[k]);
            key = list[m];
            i = m+1;
            j = n;
            while(i <= j)
            {
            while((i <= n) && (list[i] <= key))
            i++;
            while((j >= m) && (list[j] > key))
            j--;
            if( i < j)
            swap(&list[i],&list[j]);
            }
            // swap two elements
            swap(&list[m],&list[j]);
            // recursively sort the lesser list
            quicksort(list,m,j-1);
            quicksort(list,j+1,n);
            }
            }

            M M _ 3 Replies Last reply
            0
            • D DarthDana

              QuickSort is infinitely faster than a bubble sort. I use it exclusively. It recursively breaks the list up into smaller and smaller pieces. The resulting time-to-sort relative to the length of the list is linear instead of exponential. Found this from Googling QUICKSORT. There are many other sources of info out there.

              void swap(int *x,int *y)
              {
              int temp;
              temp = *x;
              *x = *y;
              *y = temp;
              }

              int choose_pivot(int i,int j )
              {
              return((i+j) /2);
              }

              void quicksort(int list[],int m,int n)
              {
              int key,i,j,k;
              if( m < n)
              {
              k = choose_pivot(m,n);
              swap(&list[m],&list[k]);
              key = list[m];
              i = m+1;
              j = n;
              while(i <= j)
              {
              while((i <= n) && (list[i] <= key))
              i++;
              while((j >= m) && (list[j] > key))
              j--;
              if( i < j)
              swap(&list[i],&list[j]);
              }
              // swap two elements
              swap(&list[m],&list[j]);
              // recursively sort the lesser list
              quicksort(list,m,j-1);
              quicksort(list,j+1,n);
              }
              }

              M Offline
              M Offline
              Maximilien
              wrote on last edited by
              #11

              danataylor wrote:

              QuickSort is infinitely faster than a bubble sort

              In general it is; but in its worse case, it's as bad as other sorts.

              Watched code never compiles.

              1 Reply Last reply
              0
              • D DarthDana

                QuickSort is infinitely faster than a bubble sort. I use it exclusively. It recursively breaks the list up into smaller and smaller pieces. The resulting time-to-sort relative to the length of the list is linear instead of exponential. Found this from Googling QUICKSORT. There are many other sources of info out there.

                void swap(int *x,int *y)
                {
                int temp;
                temp = *x;
                *x = *y;
                *y = temp;
                }

                int choose_pivot(int i,int j )
                {
                return((i+j) /2);
                }

                void quicksort(int list[],int m,int n)
                {
                int key,i,j,k;
                if( m < n)
                {
                k = choose_pivot(m,n);
                swap(&list[m],&list[k]);
                key = list[m];
                i = m+1;
                j = n;
                while(i <= j)
                {
                while((i <= n) && (list[i] <= key))
                i++;
                while((j >= m) && (list[j] > key))
                j--;
                if( i < j)
                swap(&list[i],&list[j]);
                }
                // swap two elements
                swap(&list[m],&list[j]);
                // recursively sort the lesser list
                quicksort(list,m,j-1);
                quicksort(list,j+1,n);
                }
                }

                M Offline
                M Offline
                Matthew Barnett
                wrote on last edited by
                #12

                QuickSort isn't "infinitely" faster than a bubble sort. Its efficiency depends on the choice of pivot, and its performance can be sensitive to the initial order (as explained in that article). For small arrays a bubble sort can be faster! It's usually better to use a built-in sort because that will have had time spent on it to reduce such problems.

                1 Reply Last reply
                0
                • D DarthDana

                  QuickSort is infinitely faster than a bubble sort. I use it exclusively. It recursively breaks the list up into smaller and smaller pieces. The resulting time-to-sort relative to the length of the list is linear instead of exponential. Found this from Googling QUICKSORT. There are many other sources of info out there.

                  void swap(int *x,int *y)
                  {
                  int temp;
                  temp = *x;
                  *x = *y;
                  *y = temp;
                  }

                  int choose_pivot(int i,int j )
                  {
                  return((i+j) /2);
                  }

                  void quicksort(int list[],int m,int n)
                  {
                  int key,i,j,k;
                  if( m < n)
                  {
                  k = choose_pivot(m,n);
                  swap(&list[m],&list[k]);
                  key = list[m];
                  i = m+1;
                  j = n;
                  while(i <= j)
                  {
                  while((i <= n) && (list[i] <= key))
                  i++;
                  while((j >= m) && (list[j] > key))
                  j--;
                  if( i < j)
                  swap(&list[i],&list[j]);
                  }
                  // swap two elements
                  swap(&list[m],&list[j]);
                  // recursively sort the lesser list
                  quicksort(list,m,j-1);
                  quicksort(list,j+1,n);
                  }
                  }

                  _ Offline
                  _ Offline
                  _Superman_
                  wrote on last edited by
                  #13

                  I would recommend the use of the functions from the standard library like qsort or qsort_s.

                  «_Superman_»  _I love work. It gives me something to do between weekends.

                  _Microsoft MVP (Visual C++)

                  Polymorphism in C

                  T 1 Reply Last reply
                  0
                  • B Babylon Lion

                    Hi all, I have a working program that reads stocks symbols and values from a text file and do some operations on the data, and then it outputs the the data as two reports. The first report is sorted by stock symbols, and the other report is sorted by percent gain/loss. I'm having difficulties understating how these sort functions are doing the comparisons.. Can you guys provide some explanation please?

                    //sorts the stocks naturally (stock symbol)
                    template<class elemType>
                    void listType<elemType>::sort(){
                    int i, j;
                    int min;
                    elemType temp;

                    for (i = 0; i <length; i++){
                    	min = i;
                    	for (j = i + 1; j < length; ++j)
                    	   if (list\[j\] < list\[min\])
                    		min = j;
                    	temp = list\[i\];
                    	list\[i\] = list\[min\];
                    	list\[min\] = temp;
                    }
                    

                    }

                    //sorts the stocks by percent gain/loss
                    void stockListType::sortByGain(){
                    int i, j;
                    int temp;
                    indexByGain = new int[length];

                    //Pre-populate the index array
                    for(int c = 0; c < length; c++){
                    	indexByGain\[c\] = c;
                    }
                    
                    //Sort by the percentage change
                    for (i = 0; i <length; i++){
                    	for (j = i + 1; j < length; j++){
                    	   if (list\[indexByGain\[j\]\].getPercentChange() > list\[indexByGain\[i\]\].getPercentChange()){
                    			temp = indexByGain\[i\];
                    			indexByGain\[i\] = indexByGain\[j\];
                    			indexByGain\[j\] = temp;
                    	   }
                    	}
                    }
                    

                    }

                    J Offline
                    J Offline
                    James Lonero
                    wrote on last edited by
                    #14

                    Interesting sort functions. The first function can be associated to a "bubble sort" except nothing is "bubbling up" in the list array. The inner loop is only storing the index of the smallest value. Then at the end of the second loop (bottom of the first loop), the values are swapped. This is more efficient than a bubble sort because we are not swapping the items in the array (excessive memory access) every time we determine that (list[j] < list[min]). The swap is done n times rather than (n * n) times. The second sort is sorting an array of indexes based on the percentage change. The original list array is untouched. It is used only for reference. The final result is the indexByGain array. This should be returned. But, it is not and so is lost. For the reporting, the programmer would need to run through the indexByGain to print out the report as: for (int k = 0; k < length; k++) printf("%f\n", list[indexByGain[k]].getPercentChange()); assuming that getPercentChange() returns a double or float. Sorry, my C coding is a bit rusty.

                    1 Reply Last reply
                    0
                    • B Babylon Lion

                      Hi all, I have a working program that reads stocks symbols and values from a text file and do some operations on the data, and then it outputs the the data as two reports. The first report is sorted by stock symbols, and the other report is sorted by percent gain/loss. I'm having difficulties understating how these sort functions are doing the comparisons.. Can you guys provide some explanation please?

                      //sorts the stocks naturally (stock symbol)
                      template<class elemType>
                      void listType<elemType>::sort(){
                      int i, j;
                      int min;
                      elemType temp;

                      for (i = 0; i <length; i++){
                      	min = i;
                      	for (j = i + 1; j < length; ++j)
                      	   if (list\[j\] < list\[min\])
                      		min = j;
                      	temp = list\[i\];
                      	list\[i\] = list\[min\];
                      	list\[min\] = temp;
                      }
                      

                      }

                      //sorts the stocks by percent gain/loss
                      void stockListType::sortByGain(){
                      int i, j;
                      int temp;
                      indexByGain = new int[length];

                      //Pre-populate the index array
                      for(int c = 0; c < length; c++){
                      	indexByGain\[c\] = c;
                      }
                      
                      //Sort by the percentage change
                      for (i = 0; i <length; i++){
                      	for (j = i + 1; j < length; j++){
                      	   if (list\[indexByGain\[j\]\].getPercentChange() > list\[indexByGain\[i\]\].getPercentChange()){
                      			temp = indexByGain\[i\];
                      			indexByGain\[i\] = indexByGain\[j\];
                      			indexByGain\[j\] = temp;
                      	   }
                      	}
                      }
                      

                      }

                      D Offline
                      D Offline
                      dpminusa
                      wrote on last edited by
                      #15

                      Array.Sort and ArrayList.Sort are both Quick Sorts. Can you create either of these with your data and use them?

                      "Coding for fun and profit ... mostly fun"

                      1 Reply Last reply
                      0
                      • B Babylon Lion

                        Hi all, I have a working program that reads stocks symbols and values from a text file and do some operations on the data, and then it outputs the the data as two reports. The first report is sorted by stock symbols, and the other report is sorted by percent gain/loss. I'm having difficulties understating how these sort functions are doing the comparisons.. Can you guys provide some explanation please?

                        //sorts the stocks naturally (stock symbol)
                        template<class elemType>
                        void listType<elemType>::sort(){
                        int i, j;
                        int min;
                        elemType temp;

                        for (i = 0; i <length; i++){
                        	min = i;
                        	for (j = i + 1; j < length; ++j)
                        	   if (list\[j\] < list\[min\])
                        		min = j;
                        	temp = list\[i\];
                        	list\[i\] = list\[min\];
                        	list\[min\] = temp;
                        }
                        

                        }

                        //sorts the stocks by percent gain/loss
                        void stockListType::sortByGain(){
                        int i, j;
                        int temp;
                        indexByGain = new int[length];

                        //Pre-populate the index array
                        for(int c = 0; c < length; c++){
                        	indexByGain\[c\] = c;
                        }
                        
                        //Sort by the percentage change
                        for (i = 0; i <length; i++){
                        	for (j = i + 1; j < length; j++){
                        	   if (list\[indexByGain\[j\]\].getPercentChange() > list\[indexByGain\[i\]\].getPercentChange()){
                        			temp = indexByGain\[i\];
                        			indexByGain\[i\] = indexByGain\[j\];
                        			indexByGain\[j\] = temp;
                        	   }
                        	}
                        }
                        

                        }

                        J Offline
                        J Offline
                        James Curran
                        wrote on last edited by
                        #16

                        The first one (sort()), scans the list to find the smallest item (it assumes that elemType has operator<() defined, which we presume is bases on it's ticker symbol string). It then swaps that items with the item in list[0]. Next it scans for the smallest between list[1] and the end, and swaps that with list[1], and onward, swapping the smallest among list[2] & the end with list[2]. I believe this actually makes it an insertion sort, which is slightly faster that a bubble sort (and generally considered the best for small lists) The second sort (sortByGain()) doesn't want to change the order of the items in list (which presumably have just been sorted by sort()), so it creates a array of indexes into list, so that after both functions are called list[0] is the first stock alphabetically, while list[indexByGain[0]] is the stock with the highest gain. sortByGain() does a proper (slow) Bubble sort, potenially swapping after every compare, moving the desired item (which is the smallest in the first sort and the largest in the second) one position closer to it's final location each time.

                        Truth, James

                        1 Reply Last reply
                        0
                        • _ _Superman_

                          I would recommend the use of the functions from the standard library like qsort or qsort_s.

                          «_Superman_»  _I love work. It gives me something to do between weekends.

                          _Microsoft MVP (Visual C++)

                          Polymorphism in C

                          T Offline
                          T Offline
                          ThatsAlok
                          wrote on last edited by
                          #17

                          «_Superman_» wrote:

                          I would recommend the use of the functions from the standard library like qsort or qsort_s.

                          agreed! save time

                          "Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
                          Never mind - my own stupidity is the source of every "problem" - Mixture

                          cheers, Alok Gupta VC Forum Q&A :- I/IV Support CRY- Child Relief and You

                          1 Reply Last reply
                          0
                          Reply
                          • Reply as topic
                          Log in to reply
                          • Oldest to Newest
                          • Newest to Oldest
                          • Most Votes


                          • Login

                          • Don't have an account? Register

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Categories
                          • Recent
                          • Tags
                          • Popular
                          • World
                          • Users
                          • Groups