MATLAB Help with MATLAB, creating a sorting function

AI Thread Summary
The discussion revolves around creating a MATLAB sorting function, msort, that can sort numbers in both ascending and descending order. The user initially faced issues with input formats, needing to change the function to accept variable input arguments using varargout and varargin. They successfully modified the function to handle a single array input but encountered errors when trying to include a descending sort option with additional parameters. The main challenge remains in implementing the descending sort functionality while maintaining the ability to count the number of swaps. The user seeks assistance in resolving these issues to finalize the sorting function.
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
Views
1K
Replies
8
Views
2K
Replies
1
Views
2K
Replies
5
Views
2K
Replies
4
Views
4K
Back
Top