How to sort any size matrix elements from largest to smallest using loop?

26 Ansichten (letzte 30 Tage)
Ami
Ami am 9 Apr. 2018
Kommentiert: Guillaume am 30 Apr. 2018
I am trying to write a function that rearranges the elements of any size matrix in a descending order row after row with the (1,1) element the largest and the (m,n) element the smallest without using the built in functions max, sort, or min. My code only doesn't work when the number of columns of the input matrix is 3. Can someone please tell what am I doing wrong?
function B=matrixsort(A)
[m,n]=size(A);
i=1;
j=1;
a=1;
b=2;
while i~=m || j~=n
if (A(a,b)>A(i,j) && b<n)
r=A(i,j);
A(i,j)=A(a,b);
A(a,b)=r;
b=b+1;
elseif (A(a,b)>A(i,j) && b==n && a<m)
r=A(i,j);
A(i,j)=A(a,b);
A(a,b)=r;
a=a+1;
b=1;
elseif (A(a,b)>A(i,j) && b==n && a==m && j<n)
r=A(i,j);
A(i,j)=A(a,b);
A(a,b)=r;
j=j+1;
if (j==n)
a=i+1;
b=1;
else
a=i;
b=j+1;
end
elseif (A(a,b)>A(i,j) && b==n && a==m && j==n)
r=A(i,j);
A(i,j)=A(a,b);
A(a,b)=r;
i=i+1;
j=1;
a=i;
b=b+1;
elseif (A(a,b)<=A(i,j) && b<n)
b=b+1;
elseif (A(a,b)<=A(i,j) && b==n && a<m)
a=a+1;
b=1;
elseif (A(a,b)<=A(i,j) && b==n && a==m && j<n)
j=j+1;
if (j==n)
a=i+1;
b=1;
else
a=i;
b=j+1;
end
else
i=i+1;
j=1;
a=i;
b=j+1;
end
end
B=A;
  1 Kommentar
Guillaume
Guillaume am 30 Apr. 2018
Closing your question when you've been given many useful answers is very disrespectful of the people who have given up valuable time to help you.
Rather, you should be accepting and or voting for the answers.

Melden Sie sich an, um zu kommentieren.

Antworten (3)

Birdman
Birdman am 9 Apr. 2018
One simple way is to use Bubble Sorting algorithm:
v=[4 7 2 9 6 1;8 2 9 4 0 5] %demo data
for i=1:size(v,1)
for k=1:size(v,2)
for j=1:size(v,2)-1
if v(i,j)<v(i,j+1)
temp=v(i,j+1);
v(i,j+1)=v(i,j);
v(i,j)=temp;
end
end
end
end
v %sorted demo data
  2 Kommentare
Ami
Ami am 9 Apr. 2018
thank you. but why does my code not work when the number of columns is 3?
Birdman
Birdman am 9 Apr. 2018
No idea. Your code is really hard to keep track of. You need to learn how to write more proper codes.

Melden Sie sich an, um zu kommentieren.


KSSV
KSSV am 9 Apr. 2018

Guillaume
Guillaume am 9 Apr. 2018
Bearbeitet: Guillaume am 9 Apr. 2018
I have not looked in enough details at your code to know why it doesn't work for n = 3. I suspect that it does not work for a lot more conditions. There is certainly an error in your while condition which should be:
while i~=m && j~=n
There are probably more. Learn to use the debugger. Step through your program line by line and see how the variables change as you execute each line. You'll quickly find out where it goes wrong.
I would strongly recommend you separate the test for the element swap from the test for the index increments. Something like
while ...
if A(a, b) > A(i, j)
%do swap
end
%now do index increment, again seperating the test for column from the test for row
if b < n
%increase b
else
b = 1;
if a < m
%increase a
else
%reached end of array increase i,j
%...
end
end
end
Finally, I'll point out that your sorting algorithm is extremely inefficient, the complexity is O(n^2) which is extremely bad (worst case is when all the elements are already sorted descending). There are much better algorithms.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by