思路:
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;
}