按指定顺序进行数组排序 C++
来源:互联网 发布:2016年好听的网络歌曲 编辑:程序博客网 时间:2024/06/11 02:27
前几天参加了一场笔试,有一道算法题目是 给定一个char数组,需要根据指定的顺序进行数组排序,比如,数组元素依次为ABCDE,而指定顺序为30142,那么数组的排序结果则为DABCE。要求数组不能扩容,通过两两交换,使用尽量少的辅助空间,在尽量少的时间内完成对数组的排序。
函数接口为 void mSwapSort(char* pArr, char* pPos, int nCount);
其中pArr和pPos数组大小均为nCount
在笔试的时候就有一个灵感,利用给定顺序数组pPos来辅助pArr来完成交换。但限于考试时间没有最后完成,回来之后先在网上查了一下,没有找到类似的题目,所以还是整理了一下思路,自己动手。
其实无论给定的pArr数组中元素内容是什么,都可以将其抽象为012345…,也就是用其下标来代表。如题,数组元素可以抽象为01234,我们的目标就是将其通过两两交换,最后变成目标顺序30142。
从正向来看,似乎比较困难,那么我们就反其道而行,将问题逆转过来,将目标顺序30142通过两两交换,最终变回01234,而01234只要执行逆操作,就可以变为30142。为什么说将问题逆转过来就能容易得多呢,因为目标顺序的内容已经明确指定了要自身最终需要处于的位置,比如pPos[0] = 3, 这就说明这个元素是需要最终交换到pPos[3]这个位置的(此时pPos[3] = 3),只要每次都将一个元素交换到其应当处于的位置,通过一系列迭代,整个数组的元素都能交换到目标位置,也就是01234(元素和数组下标刚好对应)。而我们只需要记录下每次交换的步骤,将pArr数组中的元素按照步骤逆推回去即可,最终代码是用递归来实现的。
示例分析:
pArr(抽象化后): 0 1 2 3 4
pPos: 3 0 1 4 2
nCount: 5
其中两个交换元素下标相同则表示当前操作元素已经达到排序目标,可以开始操作下一个元素。
接下来按照以上交换步骤逆推,即可实现01234到30142的排序
最后附上代码
#include<iostream>#include<cstring>#include<ctime>#include<cstdlib>using namespace std;void swap(char &a, char &b){ if(&a == &b)//防止对同一元素进行交换导致其被置为0 return; a ^= b; b ^= a; a ^= b;}void m_swap(char* arr, char* pos, int i, int len){ if(i == len) return; int index = pos[i]; //此次迭代需要交换的元素下标为i和index swap(pos[i], pos[index]); if(pos[i] == i) //当前元素已经处于排序目标位置 m_swap(arr, pos, i + 1, len); else m_swap(arr, pos, i, len); swap(arr[i], arr[index]);}void mSwapSort(char* pArr, char* pPos, int nCount){ m_swap(pArr, pPos, 0, nCount);}int main(){ char arr[] = {'0', '1', '2', '3', '4', 0}; //char arr[] = {'A', 'B', 'C', 'D', 'E', 0}; char pos[] = {4, 2, 3, 1, 0}; int len = strlen(arr); //随机打乱指定顺序数组,产生随机测试用例 srand(time(0)); for(int i = 0; i < 10; i++){ int i1 = rand() % len; int i2 = rand() % len; swap(pos[i1], pos[i2]); } //打乱后的指定顺序数组 cout << "pos target: "; for(int i = 0; i < len; i++) cout << (int)pos[i]; cout << endl; //调用函数 mSwapSort(arr, pos, len); //输出排列后的结果 cout << "result: "; cout << arr << endl; //输出指定顺序数组数组在排序后的变化,若正确运行会变成01234 cout << "pos after swap: "; for(int i = 0; i < len; i++) cout << (int)pos[i]; cout << endl; return 0;}
- 按指定顺序进行数组排序 C++
- SQL 按指定顺序进行排序
- SQL 按指定顺序进行排序
- SqlServer 按指定顺序进行排序
- 二维数组按指定字段进行排序
- 算法学习:按指定字母顺序对单词进行排序
- mysql 按指定顺序排序
- SqlServer按照指定顺序对字段进行排序
- SqlServer按照指定顺序对字段进行排序
- php数组根据指定字段对数组进行排序函数
- mysql 按指定数组排序
- mysql查询结果按指定顺序排序
- 实现指定顺序排序
- 按照指定顺序排序
- 用TreeSet对指定字符串数组内容进行排序(1)
- PHP 对二维数组进行指定key排序
- 二维数组按照指定的键名的值进行排序
- php 对二维数组的指定键值进行排序
- POI与JXL的实战性能对比
- 移动端fixed定位在底部的按钮
- 数组的首地址与数组的首地址取地址
- 【NOIP2016提高A组模拟9.14】排序
- 2017百度深圳研发中心校招一面
- 按指定顺序进行数组排序 C++
- H5前端性能测试快速入门
- barcode 条形码
- 特别总账业务处理
- eclipse 设置默认编码为Utf-8
- iOS 10打印 无关的日志
- get post区别
- 《深入java虚拟机》书里的java面试题-详解获取类的四种方法
- 1119. Pre- and Post-order Traversals (30)