思路:
1、创建结构体,数据成员:打印编号,在数组中的初始序号,按照打印编号升序排序后的数组编号
2、保存初始顺序
3、按照打印编号升序排序
4、保存排序后顺序关系
5、恢复原来顺序关系
6、此时输出排序后顺序关系,即使正确结果
(注意,排序时相等元素必须交换,建议不要使用算法库里面的排序算法)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef struct node
{
int pri; //打印编号
int before; //打印序列在数组中的序号
int after; //按照打印编号升序排序后,在数组中的序号
}node;
void swap(node &a,node &b)
{
node temp;
temp = a;
a = b;
b = temp;
}
void insertsort1(vector<node> &vec,int len) //按照打印编号插入排序,一定要注意打印编号相等的处理,相等必须交换
{
if (len <= 1) return;
for (int i = 1; i < len; i++)
{
for (int j = i; j>0; j--)
{
if (vec[j].pri >= vec[j - 1].pri) swap(vec[j],vec[j-1]);
}
}
}
void insertsort2(vector<node> &vec, int len)//按照初始数组下标排序,恢复排序前的位置关系
{
if (len <= 1) return;
for (int i = 1; i < len; i++)
{
for (int j = i; j>0; j--)
{
if (vec[j].before < vec[j - 1].before) swap(vec[j], vec[j - 1]);
}
}
}
void rintOrder(const int input[], int len, int output[])
{
if (len<1) return;
vector<node> data(len);
for (int i = 0; i<len; i++) //创建结构体
{
data[i].pri = input[i];
data[i].before = i;
}
insertsort1(data,len); //按照打印编号升序,排序
for (int i = 0; i<len; i++) //保存某一打印编号,第几个输出
{
data[i].after = i;
}
insertsort2(data, len); //恢复数组初始位置关系
for (int i = 0; i<len; i++) //输出数据
{
output[i] = data[i].after;
}
}
int main()
{
int input[] = { 9, 3, 5,3 };
int output[4];
rintOrder(input, 4, output);
return 0;
}