思路: 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; }
点赞 评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客网
牛客企业服务