我写了以下代码来排序数字。该算法有效,但我想知道代码属于哪种类型的排序算法(冒泡,合并,快速等)。请帮忙。
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";
}
答案 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
只需检查代码本身,就可以识别出一些特征:
检查输出时:
有序列表是从左到右构建的。
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
被比较的索引并不总是相邻的。在第一次迭代中,比较索引0
和3
。
5
和1
进行比较,然后将1
与所有其他元素进行比较。对于所有这些特征,算法最类似于选择排序。维基百科上的排序页面通常在表征和说明算法方面做得相当不错,但查阅算法书也很有帮助。