C++ 在循环排序算法中,我在寻找一个我们观察到算法不稳定性质的例子
我阅读了有关循环排序算法的文章,发现它本质上是不稳定的,然而,我很难提出一个案例来说明循环算法的不稳定本质。 有人能举个例子,让我们观察算法的不稳定性吗 有关算法的更多信息:- 以下是我的循环排序算法代码:-C++ 在循环排序算法中,我在寻找一个我们观察到算法不稳定性质的例子,c++,algorithm,sorting,C++,Algorithm,Sorting,我阅读了有关循环排序算法的文章,发现它本质上是不稳定的,然而,我很难提出一个案例来说明循环算法的不稳定本质。 有人能举个例子,让我们观察算法的不稳定性吗 有关算法的更多信息:- 以下是我的循环排序算法代码:- #include <iostream> using namespace std; int main() { int n; cin >> n;
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int *arr;
arr=new int[n];
for (int i = 0; i < n; i++)
cin >> arr[i];
int cyStart, item, pos;
for (int cyStart = 0; cyStart < (n - 1); cyStart++)
{
item = arr[cyStart];
pos = cyStart;
for (int i = cyStart + 1; i < n; i++)
{
if (item > arr[i])
pos++;
}
if (pos == cyStart)
continue;
while (item == arr[pos])
pos++;
if (item != arr[pos])
swap(arr[pos], item);
while (cyStart != pos)
{
pos = cyStart;
for (int i = cyStart + 1; i < n; i++)
{
if (item > arr[i])
pos++;
}
while (item == arr[pos])
pos++;
if (item != arr[pos])
swap(arr[pos], item);
}
}
for(int i=0;i<n;i++)
cout << arr[i] << " ";
return 0;
}
#包括
使用名称空间std;
int main()
{
int n;
cin>>n;
int*arr;
arr=新整数[n];
对于(int i=0;i>arr[i];
内部零件、项目、位置;
对于(int-cyStart=0;cyStart<(n-1);cyStart++)
{
项目=arr[cyStart];
pos=膀胱术;
对于(int i=cyStart+1;iarr[i])
pos++;
}
if(pos==cyStart)
持续
而(项目==arr[pos])
pos++;
如果(项目!=arr[pos])
掉期(arr[pos],项目);
while(cyStart!=pos)
{
pos=膀胱术;
对于(int i=cyStart+1;iarr[i])
pos++;
}
而(项目==arr[pos])
pos++;
如果(项目!=arr[pos])
掉期(arr[pos],项目);
}
}
对于(int i=0;i,假设我们有一组数据,如下所示:
两组字母“A”到“E”。为了更好地区分它们,我将调用附加数字的重复数据。因此“A”s将是“A1”和“A2”,依此类推。
现在,让我们尝试根据您提到的算法对它们进行排序
- 步骤1:
取出第一个数据,找到它应该放在的地方。因为我们知道有10个项目,或者2套5个相同的项目,我们知道“E1”会放在第9位
- 步骤2:
“E1”放在第9位,之前在第9位的项目取出进行分拣
- 步骤3:
“E2”放在第10位,“D2”被取出进行排序
- 步骤4:
“E2”放在第7位,“B2”被取出进行排序
现在您可能已经注意到一个问题了!!
“D2”放在第7位,这意味着“D1”只能放在第8位,尽管它应该放在“D2”前面
这就是“不稳定排序”的意思。排序的结果将独立于原始数据的顺序
继续排序:
- 步骤5:
- 步骤6:
- 步骤7:
- 您刚刚完成了第一个周期。
- 开始下一个周期:
- 步骤8:
- 步骤9:
- 步骤10:
- 步骤11:
- 步骤12:
- 您刚刚完成排序
现在看看您的数据,您会注意到两对数据的排序不稳定:因此,假设我们有一组数据,如下所示:
两组字母“A”到“E”。为了更好地区分它们,我将调用附加数字的重复数据。因此“A”s将是“A1”和“A2”,依此类推。
现在,让我们尝试根据您提到的算法对它们进行排序
- 步骤1:
取出第一个数据,找到它应该放在的地方。因为我们知道有10个项目,或者2套5个相同的项目,我们知道“E1”会放在第9位
- 步骤2:
“E1”放在第9位,之前在第9位的项目取出进行分拣
- 步骤3:
“E2”放在第10位,“D2”被取出进行排序
- 步骤4:
“E2”放在第7位,“B2”被取出进行排序
现在您可能已经注意到一个问题了!!
“D2”放在第7位,这意味着“D1”只能放在第8位,尽管它应该放在“D2”前面
这就是“不稳定排序”的意思。排序的结果将独立于原始数据的顺序
继续排序:
- 步骤5:
- 步骤6:
- 步骤7:
- 您刚刚完成了第一个周期。
- 开始下一个周期:
- 步骤8:
- 步骤9:
- 步骤10:
- 步骤11:
- 步骤12:
- 您刚刚完成排序
现在看看你的数据,你会注意到有2对数据排序不稳定:请阅读,什么是“循环算法”?也许可以提供一个描述或链接,因为我认为它并不广为人知。我还建议你选择一两个,了解更多关于标准库的信息,以及它可以帮助你做些什么(例如,通过使用而不是显式分配内存)。只有当排序元素具有排序时未考虑的某些特征时,才能观察排序算法的稳定性。对于int
,稳定或不稳定的算法将产生完全相同的结果。对于struct X{int n;std::string name;};
,如果您仅按n
值对此类结构进行排序,您可能会注意到一个差异。请看一看。我相信这正是您要查找的情况,只是排序是使用Python完成的。请阅读,什么是“循环算法”?也许可以提供一个描述或链接,因为我认为它并不广为人知。我还建议您选择一两个,了解更多关于标准库的信息,以及它可以为您提供哪些帮助(例如使用而不是分配m)