
冒泡法:
a=randint(1,10,[1 10])
for i=1:length(a)
for j=1:length(a)-i
if a(j)>a(j+1)
t=a(j);a(j)=a(j+1);a(j+1)=t;
end
end
end
a
a =
5 5 4 2 7 7 8 5 6 2%%原序列
a =
2 2 4 5 5 5 6 7 7 8%%排序后序列
1楼是选择法排序,同样适用!
a=rand(100,100);
tic
[b,pos]=sort(a(:,1));
aa=a(pos,:);
toc
tic
A=sortrows(a,1);
toc
det(aa-A)
前面的算法时间要短,效果是一样的
Elapsed time is 0000110 seconds
Elapsed time is 0000259 seconds
ans =
0
用个小矩阵检测下
a=magic(5);
tic
[b,pos]=sort(a(:,1));
aa=a(pos,:)
toc
tic
A=sortrows(a,1)
toc
det(aa-A)
a =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
aa =
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
17 24 1 8 15
23 5 7 14 16
Elapsed time is 0000133 seconds
A =
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
17 24 1 8 15
23 5 7 14 16
Elapsed time is 0000223 seconds
ans =
0
如何在矩阵A中找到0的位置,然后把0放在最前面,后面的数字依序排列
改问题实际上就是查找、提取、排序问题,此问题可以这样来解决。
1、使用find函数,在矩阵A中查找0的位置;即
[m,n]=find(A==0); %m是行的位置,n是列的位置
2、提取含0以后的数据并赋值给A2,提取0以前的数据并赋值给A1
3、排序,B=[A2,A1],将0以后的数据放在首位,然后再0以前的数据排在后面
4、执行代码
A=[2 3 9 4 0 5 7 6 8 1]
[m,n]=find(A==0);
A1=A(m,1:n-1);
A2=A(m,n:end);
B=[A2,A1]
5、执行结果
在Matlab中排序某个向量时,可以使用sort(A),其中A为待排序的向量,如果仅是用来排序A,那么直接使用sort(A)即可, 如果排序后还需要保留原来的索引可以用返回值,即[B,ind]=sort(A),计算后,B是A排序后的向量,A保持不变,ind是B中每一项对应于A 中项的索引。排序是按升序进行的。
由于在sort函数的结果中,是按升序排序的,要转换成降序,先用X=eye(n)生成一个n维的单位阵,然后用X=rot90(X)将其旋转为次对角线的单位阵,再用原来矩阵乘以X即可,如要讲A逆序排列采用如下步骤:
X=eye(size(A));
X=rot90(X);
A=AX;
假如a是一个2n的矩阵,即两行
b=a(1,:);
[c,pos]=sort(b);%pos为排序后的下标,c为第一行的排序结果;
a(2,:)=a(2,pos);%第二行按照第一行排序的下标对应
a(1,:)=c;%第一行结果重新赋给a 的第一行
以下适用于mn的矩阵按第一行排序
[ b, pos ] = sort( a( 1, : ) );
a = a( :, pos );
matlab help:
Syntax:
B = sort(A)
B = sort(A,dim)
B = sort(,mode)
[B,IX] = sort()
%% 生成实验数据
n = 6;
A = cell(n,1);
h1 = randint(1,n,[1 10]); % 相同的第 1 行数据
for p = 1:n
h2 = randint(1,n,[1 10]); % 生成第 2 行数据
A{p} = [h1; h2];
end
%% 实现步骤:
%% 1取出所有矩阵的第 2 行数据形成新矩阵 H2
%% 2将 H2 进行行排序并取得其索引值
[m,n] = size(A);
H2 = zeros(m,m);
for p = 1:m
H2(p,:) = A{p}(2,:);
end
[B,index] = sortrows(H2,1); % 行排序无降序选择,只能升序排
R = index(end:-1:1) % 升序索引逆序输出
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)