What Mistake I am making in the code

3 views (last 30 days)
Manav Divekar on 4 Nov 2021
Answered: Steven Lord on 4 Nov 2021
I want to randomly pick two numbers from [39 25 91 71] swap it. and use while loop so that it swaps continuely until the vector is sorted. and display the sorted vector.
function out = sortbyrandomswaps(n)
x = 0;
y = 0;
while ~ all(diff(n)>=0)
x = n(randi(numel(n)));
y = n(randi(numel(n)));
x = a;
y = x;
a = y;
end
out = all(diff(n)>=0);

Yongjian Feng on 4 Nov 2021
Edited: Yongjian Feng on 4 Nov 2021
Maybe this:
sortbyrandomswaps([5 4 3 2 1]);
function out = sortbyrandomswaps(n)
while ~ all(diff(n)>=0)
idx1 = randi(numel(n));
idx2 = randi(numel(n));
a = n(idx2);
n(idx2) = n(idx1);
n(idx1) = a;
disp(n); % for debug only. Remove it if everything works.
end
out = all(diff(n)>=0);
end

Steven Lord on 4 Nov 2021
FYI you can perform a swapping operation in one step without needing an explicit temporary:
x = (1:10).^2
x = 1×10
1 4 9 16 25 36 49 64 81 100
toSwap = [4 7]
toSwap = 1×2
4 7
x(toSwap) = x(flip(toSwap)) % key step
x = 1×10
1 4 9 49 25 36 16 64 81 100
You could generalize this a bit if you wanted to swap a series of elements.
toSwap2 = [2 5 3 8 1];
x(toSwap2) = x(circshift(toSwap2, 1))
x = 1×10
64 1 25 49 4 36 16 9 81 100
The second element of x goes to position 5, the fifth to position 3, the third to position 8, the eighth to position 1, and the first to position 2.

R2021a

Community Treasure Hunt

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

Start Hunting!