题目:
让无序数组元素进行排序,排序完后将排序后元素对应的原先元素的位置输出
(1)方法1
方法1:先将数组元素原先的对应位置记录在另一个数组中
并在进行选择排序的过程中,交换数组元素的同时也交换对应位置数组中的对应元素值
/*
选择法排序
并在排序后的数组元素在原先数组的对应位置输出
方法1:先将数组元素原先的对应位置记录在另一个数组中
并在进行选择排序的过程中,交换数组元素的同时也交换对应位置数组中的对应元素值
*/
#include <iostream>
using namespace std;
int main( )
{
int a[11],i,j,k,t; //a数组记录元素数值
int f[11]; //f数组记录a中原先的数组元素位置
cout<<"enter the originl array:"<<endl;
for(i=1;i<=10;i++) cin>>a[i]; //输入10个数
for(i=1;i<=10;i++) f[i]=i; //初始化原先数组元素位置
//选择法排序
for(i=1;i<=9;i++)
{ k=i;
for(j=i+1;j<=10;j++)
if(a[j]<a[k]) k=j;
//交换a[k]和a[i]
t=a[k];
a[k]=a[i];
a[i]=t;
//交换f[k]和f[i],记录位置随数据交换的同时也要改变
t=f[k];
f[k]=f[i];
f[i]=t;
}
cout<<"the sorted array:"<<endl;
for(i=1;i<=10;i++) cout<<a[i]<<" "; //输出10个已排好序的数
cout<<endl;
cout<<"putout the location of originl array:"<<endl;
for(i=1;i<=10;i++) cout<<f[i]<<" ";
cout<<endl;
return 0;
}
(2)方法2
方法2:先将数组元素存放在另一个数组中
排序
对排序后的数组元素依次去查找原先数组中的对应位置
/*
选择法排序
并在排序后的数组元素在原先数组的对应位置输出
方法2:先将数组元素存放在另一个数组中
排序
对排序后的数组元素依次去查找原先数组中的对应位置
*/
#include <iostream>
using namespace std;
#define N 10
int main( )
{
int a[N+1],i,j,k,t,flag; //a数组记录元素数值,flag表示查找到的位置
int b[N+1]; //b数组存放a数组中的所有元素值
cout<<"enter the originl array:"<<endl;
for(i=1;i<=N;i++) cin>>a[i]; //输入10个数
for(i=1;i<=N;i++) b[i]=a[i]; //初始化原先数组元素位置
//选择法排序
for(i=1;i<=N-1;i++)
{ k=i;
for(j=i+1;j<=N;j++)
if(a[j]<a[k]) k=j;
//交换a[k]和a[i]
t=a[k];
a[k]=a[i];
a[i]=t;
}
cout<<"the sorted array:"<<endl;
for(i=1;i<=N;i++) cout<<a[i]<<" "; //输出10个已排好序的数
cout<<endl;
cout<<"putout the location of originl array:"<<endl;
for(j=1;j<=N;j++)
{ if(j==1) //排序后第一个元素的位置查找
{ for(i=1;i<=N;i++)
if(a[j]==b[i])
{cout<<i<<" ";
flag=i; //记录下当前找到的位置
break;
}
}
else //排序后除了一个元素以外其它元素的查找
{ if(a[j-1]==a[j]) //如果排序后的相邻两个元素相等,即当前元素与前一次查找的元素相同
{for(i=flag+1;i<=N;i++) //则从上次找到的位置flag后一个位置开始查找
if(a[j]==b[i])
{cout<<i<<" ";
flag=i; //记录下当前找到的位置
break;
}
}
else //当前元素与前一次查找的元素不相同
{for(i=1;i<=N;i++)
if(a[j]==b[i])
{cout<<i<<" ";
flag=i; //记录下当前找到的位置
break;
}
}
}
}
cout<<endl;
return 0;
}