无法找到代码所属的排序算法

时间:2015-02-07 14:35:31

标签: c++ algorithm sorting

我写了以下代码来排序数字。该算法有效,但我想知道代码属于哪种类型的排序算法(冒泡,合并,快速等)。请帮忙。

int SwapNums(int *Num1,int *Num2);

int main()

{
    int seq[5]={5,1,4,2,8};    
    int ArrayLen=sizeof(seq)/sizeof(*seq);    
    int i,j;

    for(i=1;i<ArrayLen;i++)
    { 
        for(j=i-1;j<ArrayLen;j++)
            if(seq[i-1]>seq[j])
                SwapNums(&seq[i-1],&seq[j]);
    }

    for(i=0;i<ArrayLen;i++)
        cout<<seq[i]<<"\n";
}

3 个答案:

答案 0 :(得分:0)

这是一种泡泡算法。

答案 1 :(得分:0)

它很可能是一个冒泡排序算法。 (需要SwapNums的代码(int * Num1,int * Num2);确定)。

答案 2 :(得分:0)

它是selection sort,在每个中间求解时执行交换,而不是等到迭代结束才能执行交换。


除了复杂性和空间之外,排序算法通常具有可用于身份的各种特征。在识别算法的类型时,在算法的每个步骤期间提供额外的输出可能是有帮助的,然后使用该输出来定义特征。例如,这里是基于原始算法的example,它在每个步骤提供输出:

#include <array>
#include <iostream>
#include <utility>

void print(std::array<int, 5>& array)
{
  for(int i: array)
    std::cout << i << " ";
  std::cout << std::endl;
}

int main()
{
  std::array<int, 5> seq = {5, 1, 4, 2, 8};
  std::cout << "Start: ";
  print(seq);

  for (std::size_t i=0; i < seq.size(); ++i)
  {
    for (std::size_t j=i+1; j < seq.size(); ++j)
    {
      std::cout << "index: " << i << "," << j << "; "
                << "element: " << seq[i] << "," << seq[j] << "; ";

      if (seq[i] > seq[j])
        std::swap(seq[i], seq[j]);

      print(seq);
    }
    std::cout << "-- next iteration --" << std::endl;
  }
  std::cout << "End: ";
  print(seq);
}

及其输出:

Start: 5 1 4 2 8 
index: 0,1; element: 5,1; 1 5 4 2 8 
index: 0,2; element: 1,4; 1 5 4 2 8 
index: 0,3; element: 1,2; 1 5 4 2 8 
index: 0,4; element: 1,8; 1 5 4 2 8 
-- next iteration --
index: 1,2; element: 5,4; 1 4 5 2 8 
index: 1,3; element: 4,2; 1 2 5 4 8 
index: 1,4; element: 2,8; 1 2 5 4 8 
-- next iteration --
index: 2,3; element: 5,4; 1 2 4 5 8 
index: 2,4; element: 4,8; 1 2 4 5 8 
-- next iteration --
index: 3,4; element: 5,8; 1 2 4 5 8 
-- next iteration --
-- next iteration --
End: 1 2 4 5 8 

只需检查代码本身,就可以识别出一些特征:

  • 复杂度为O(n ^ 2)
  • 没有分配额外的空间,因此空间复杂度为O(1)
  • 该算法不使用分支递归,因此它不是分而治之的算法。
  • 这是comparison sort

检查输出时:

  • 有序列表是从左到右构建的。

    Start: 5 1 4 2 8
    End of 1st iteration: 1 5 4 2 8
    End of 2nd iteration: 1 2 5 4 8
    End of 3rd iteration: 1 2 4 5 8
    End of 4th iteration: 1 2 4 5 8
    
  • 被比较的索引并不总是相邻的。在第一次迭代中,比较索引03

  • 被比较的元素总是包括当前已知的最小未排序元素。在第一次迭代中,51进行比较,然后将1与所有其他元素进行比较。

对于所有这些特征,算法最类似于选择排序。维基百科上的排序页面通常在表征和说明算法方面做得相当不错,但查阅算法书也很有帮助。