资源简介

用matlab实现的快速排序以及归并排序

资源截图

代码片段和文件信息

% ============================================================= %
% ==***************** 归并排序算法(MergeSort)*****************== %
% ============================================================= %
% 基本思想:
% 将两个(或两个以上)有序表合并成一个新的有序表,即把待排序的序列...
% 分为若干个有序的子序列,再把有序的子序列合并为整体有序序列
% 工作原理:
% 1.申请空间,使其大小为两个已经排序序列之和,用于存放合并后的序列;
% 2.设定两个指针,最初位置分别为两个已经排序序列的起始位置;
% 3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并...
%   移动指针到下一位置;
% 4.重复步骤3直到某一指针超出序列列尾。
function y = MergeSort(xvarargin)
            % varargin 为Matlab内部变量,cell 型,依次存储函数在其所在位置的所有输入变量
optargin = length(varargin);
if optargin == 0
    M = 1; % M = 1 为默认的已排序序列的长度
else
    M = varargin{1};
end
N_x = length(x);
N_log2 = ceil(log2(N_x));
N_Insert = 2^N_log2 - N_x;
x = [x ones(1 N_Insert)*Inf];
N = length(x);
y = x;
k = 1;
while(k*M*2 <= N)% 当前比较第k组,每组有两个已排序序列
    i = (k - 1)*M*2 + 1; % i 指向当前组的第一个已排序序列的第一个元素
    j = i + M;           % i 指向当前组的第二个已排序序列的第一个元素
    index = (k - 1)*M*2 + 1; % 与当前组相对应的合并空间的下标
    while i <= (k - 1)*M*2 + M  &&  j <= k*M*2
        if x(i) < x(j)
            y(index) = x(i);
            i = i + 1;
            index = index + 1;
         else
            y(index) = x(j);
            j = j + 1;
            index = index + 1;
        end
    end
    if i > (k - 1)*M*2 + M
        y(index : k*M*2) = x(j : k*M*2);
    else
        y(index : k*M*2) = x(i : k*M*2 - M);
    end
    k = k + 1; % 指向下一组
end
M = M*2;
if M < N
    y = MergeSort(yM);
end
y = y(1 : N_x);
    

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       1812  2014-03-03 16:19  归并排序\MergeSort.asv

     文件       1803  2014-03-03 16:19  归并排序\MergeSort.m

     文件        855  2014-03-03 09:40  快速排序\QuickSort.asv

     文件        998  2014-03-03 10:10  快速排序\QuickSort.m

     目录          0  2014-03-03 15:12  归并排序

     目录          0  2014-03-03 15:12  快速排序

----------- ---------  ---------- -----  ----

                 5468                    6


评论

共有 条评论