森之张卫东 发表于 2015-9-16 22:48

Matlab---数据排序-2

答案:这个程序必须提示使用者提供输入数据,对其进行排序,并输出排序结要。这个程序的设计过程如下:1.陈述问题我们刚才没有指定要排序的数据类型。如果数据是数字,那么问题的陈述如下。开发一个程序,它能够读取在命令窗口中输入的任意类型的数字,用独立的自定义函数对读取的值进行排序,并在命令窗口写出排序结果。2.定义输入输出量这个程序的输入值是在命令窗口键入的数字值。这个程序的输出量是写在命令窗口中的排序结果。3.设计算法这个问题可以分解为三大步:
Read the input data into an arraySort the data in ascending orderWrite the sorted data

第一大步是读取数据。我们必须提示使用者输入输入数据的个数,然后读取数据。因为我们知道所要读取的数的确切个数,所以可以用for循环主读取合适的数据。它的伪代码如下:
Prompt user for the number of data valuesRead the number of data valuesPreallocate an input arrayfor ii = 1:number of values       Promptfor next value       Readvalueend

下一步,我们必须要用独立的函数对数据进行排序。我们需要对数据进行naval-1次浏览,每一次找出一个最小值。我们将用一个指针来寻找每一次浏览的最小值。一量最小值被找到,如果它不在列表的顶端,它就与列表顶端的元素进行交换。伪代码如下:
for ii = 1:nvals -1% Find the minimum value in a(ii) through a(nvals)    iptr ← ii    for jj =ii +1 to nvals        ifa(jj) < a(iptr)           iptr ← a(iptr)        end    end% iptr now points to the min value, so swap a(iptr)% with a(ii) if iptr ~= ii.    if ii ~=iptr        temp ← a(ii)        a(ii)← a(iptr)       a(iptr) ← temp    endend

最后一步是输出排序结果。这个步骤的伪代码不需要重复。最终的伪代码是这三大步伪代码的联合。4.把伪代码转化为MATLAB语言选择性排序的MATLAB代码如下所示:
function out = ssort(a)%SSORT Selection sort data in ascending order% Function SSORT sorts a numeric data set into% ascending order. Note that the selection sort% is relatively inefficient. DO NOT USE THIS% FUNCTION FOR LARGE DATA SETS. Use MATLAB's% "sort" function instead.% Define variables:% a        --Input array to sort% ii       --Index variable% iptr     --Pointer to min value% jj       --Index variable% nvals    --Number of values in "a"% out      --Sorted output array% temp     --Temp variable for swapping% Record of revisions:% Date     Programmer      Description ofchange% ====     ==========      =====================% 12/19/98  S. J. Chapman   Original code% Get the length of the array to sortnvals = size(a,2);% Sort the input arrayfor ii = 1:nvals-1% Find the minimum value in a(ii) through a(n)    iptr =ii;    for jj =ii+1:nvals        ifa(jj) < a(iptr)           iptr = jj;        end    end% iptr now points to the minimum value, so swapa(iptr)% with a(ii) if ii ~= iptr.    if ii ~=iptr        temp= a(ii);        a(ii)= a(iptr);       a(iptr) = temp;    endend% Pass data back to callerout = a;

调用选择性排序函数的程序如下:
% Script file: test_ssort.m%% Purpose:% To read in an input data set, sort it intoascending% order using the selection sort algorithm, and to% write the sorted data to the Command window. This% program calls function "ssort" to dothe actual% sorting.%% Record of revisions:% Date     Programmer      Description ofchange% ====     ==========     =====================% 12/19/98  S. J. Chapman   Original code%% Define variables:% array        --Input data array% ii           --Index variable% nvals        --Numberof input values% sorted       --Sorted data array% Prompt for the number of values in the data setnvals = input('Enter number of values to sort: ');% Preallocate arrayarray = zeros(1,nvals);% Get input valuesfor ii = 1:nvals    %Promptfor next value    string =['Enter value ' int2str(ii) ': '];   array(ii)=input(string);end% Now sort the datasorted = ssort(array);% Display the sorted result.fprintf('\nSorted data:\n');for ii = 1:nvals    fprintf('%8.4f \n',sorted(ii));end

5.检测程序为了检测这个程序,我们应当创建一个输入数据集,并运行这个程序。这个数据集应当包含由正负数混合组成,还有至少包括一个完全一样的值,以观察在这些情况下程序是否正常工作。
>> test_ssortEnter number of values to sort: 6Enter value 1: -5Enter value 2: 4Enter value 3: -2Enter value 4: 3Enter value 5: -2Enter value 6: 0Sorted data:  -5.0000   -2.0000   -2.0000    0.0000    3.0000    4.0000

对于我们检测的数据,程序给出了正确的结果。注意从正数到负数,还有重复值,这个程序工作正常。



森之张卫东 发表于 2015-9-16 22:48

排序非常重要,希望大家好好看看!!!
页: [1]
查看完整版本: Matlab---数据排序-2