Help with MATLAB, creating a sorting function

Click For Summary

Discussion Overview

The discussion revolves around creating a MATLAB sorting function that can sort numbers in both ascending and descending order. Participants are exploring how to implement variable input arguments and how to count the number of swaps made during the sorting process.

Discussion Character

  • Technical explanation
  • Exploratory
  • Homework-related

Main Points Raised

  • One participant presents an initial version of the sorting function, noting that it works with an array input but not with individual number inputs.
  • Another participant modifies the function to use varargout and varargin, but expresses uncertainty about how to adapt the rest of the code accordingly.
  • There is a discussion about how to implement descending order sorting, with a participant attempting to add functionality for this but encountering an error related to data types when using cell2mat.
  • Participants mention the need for proper indentation in the code for clarity.

Areas of Agreement / Disagreement

Participants do not reach a consensus on how to implement the descending order functionality or resolve the data type error encountered. Multiple approaches and uncertainties remain in the discussion.

Contextual Notes

Limitations include unresolved issues with handling mixed data types in input arguments and the incomplete implementation of descending order sorting.

NosajW
Messages
11
Reaction score
0
This is what I had originally

function out = msort(x)
%This function helps sort numbers in ascending and descending order.
%To put in descending order, user must include 'd' in the input.

y = length(x);
sorted = 0;
n = 0;

while ~sorted
sorted = 1;
for i = 1:y-1
if x(i) > x(i+1)
n = n + 1;
t = x(i);
x(i) = x(i+1);
x(i+1) = t;
sorted = 0;
end
end
end


% while ~sorted
% sorted = 1;
% for i = 1:y-1
% if x(i) < x(i+1)
% n = n + 1
% t = x(i);
% x(i) = x(i+1);
% x(i+1) = t;
% sorted = 0;
% end
% end
% end;

out = x;

The program works if i set x = to a set of numbers and run msort(x), it won't work if I do msort(10,9,5,4). It will work if I do msort([10,9,5,4]). I realized I have to use varargout and varargin which leads me to change the first line of the program to:

function [varargout] = msort(varargin)

but if I change that I am not sure how I would change the rest of the code with all the x's, and I'm also not sure how I would be able to show the number of swaps with the sorted numbers like

[b,n] = msort(10,9,5,4)

b = 4,5,9,10
n = 6 (number of swaps)

I didn't do the descending part of the program yet. Please help! Thanks
 
Physics news on Phys.org
There should be indentations there but it's not showing for some reason..
 
function [varargout] = msort(varargin)
%This function helps sort numbers in ascending and descending order.
%To put in descending order, user must include 'd' in the input.
x = cell2mat(varargin);
y = nargin;
sorted = 0;
n = 0;
while ~sorted
sorted = 1;
for i = 1:y-1
if x(i) > x(i+1)
n = n + 1;
t = x(i);
x(i) = x(i+1);
x(i+1) = t;
sorted = 0;
end
end
end

% else
%
% while ~sorted
% sorted = 1;
% for i = 1:y-1
% if x(i) < x(i+1)
% n = n + 1
% t = x(i);
% x(i) = x(i+1);
% x(i+1) = t;
% sorted = 0;
% end
% end
% end
% end

if nargout > 2
disp('Too many output arguments.')
return
end

for i = 1:nargout
varargout{1} = x;
varargout{2} = n;
end

i got up to this now... I'm not sure how to allow the user to do descending

msort(1,2,3,4,5,'d')

? Error using ==> cell2mat
All contents of the input cell array must be of the same data type.

Error in ==> msort at 13
x = cell2mat(varargin);
 
NosajW said:
function [varargout] = msort(varargin)
Code:
%This function helps sort numbers in ascending and descending order.
%To put in descending order, user must include 'd' in the input.



x = cell2mat(varargin);
y = nargin;
sorted = 0;
n = 0;


    
    while ~sorted
        sorted = 1;
        for i = 1:y-1
            if x(i) > x(i+1)
                n = n + 1;
                t = x(i);
                x(i) = x(i+1);
                x(i+1) = t;
                sorted = 0;
            end
        end
    end

% else
%     
%     while ~sorted
%         sorted = 1;
%         for i = 1:y-1
%             if x(i) < x(i+1)
%                 n = n + 1
%                 t = x(i);
%                 x(i) = x(i+1);
%                 x(i+1) = t;
%                 sorted = 0;
%             end
%         end
%     end
% end

if nargout > 2
    disp('Too many output arguments.')
    return
end

for i = 1:nargout
    varargout{1} = x;
    varargout{2} = n;
end

i got up to this now... I'm not sure how to allow the user to do descending

msort(1,2,3,4,5,'d')

? Error using ==> cell2mat
All contents of the input cell array must be of the same data type.

Error in ==> msort at 13
x = cell2mat(varargin);

Use the
Code:
 tag for fixed width spacing.  It will make things much nicer for everyone.
 

Similar threads

  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 8 ·
Replies
8
Views
3K
  • · Replies 5 ·
Replies
5
Views
3K
Replies
5
Views
3K
  • · Replies 5 ·
Replies
5
Views
4K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 2 ·
Replies
2
Views
3K
Replies
1
Views
2K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 4 ·
Replies
4
Views
4K