问题:在MATLAB中有一个专门排序的函数 sort(),但是该函数对于一维数组的排序非常便捷,但是对于多维数组按照某一个标准来排序就出现困难。对于一般排序来说,如果数据量在100-1000个之间可以选择“冒泡法”进行排序,这种方法容易理解,也容易编写,但是数据量过大时,冒泡法在执行效率上会出现问题。这是就有一种算法复杂程度为:nlogn的排序方法--归并排序。
%归并排序
clear;clc;
tic;
% unsorted = [0,0,2,5,6,8,4,0,7,9; 1,3,0,5,6,8,0,10,7,9; 1,3,2,5,6,8,4,10,7,9]; %没有排序的数组
load ('totalDx.mat'); % 此句是为了调试用,联合起来的时候请删除
[k ,r] = size(totalD ); %获取数组长度,是二维数组时,返回行数与列数中较大值
p = 1;
% c = size(unsorted,2); %返回数组的列数,size(unsorted,1)返回数组的行数
totalD = Mysort(totalD , p , r);
toc;
function [ unsorted ] = Mysort( unsorted ,p , r )
%UNTITLED2 Summary of this function goes here
% Detailed explanation goes here
clc;
if p<r
[q,unsorted] = Mysort1(unsorted,p,r); %这是什么意思
unsorted = Mysort(unsorted,p,q-1);
unsorted = Mysort(unsorted,q+1,r);
end
end
function [ t, unsorted ] = Mysort1( unsorted , p , r )
%UNTITLED3 Summary of this function goes here
% Detailed explanation goes here
x = unsorted(3,r); %取未排序的数组的最后一个数据
i = p-1;
temp =zeros(3,1);
for j = p:r-1
if unsorted(3,j) <= x
i=i+1;
temp=unsorted(:,i);
unsorted(:,i)=unsorted(:,j);
unsorted(:,j)=temp;
end
end
temp = unsorted(:,i+1);
unsorted(:,i+1) = unsorted(:,r);
unsorted(:,r) = temp;
t = i+1;
end
运行效果:
25万个数据排序总时间为23.6s