交换任意两个元素进行排序进行的最小交换次数
2018-03-22 00:09
330 查看
核心思路 :
原始数组 A: 8 3 5 1 0
最终数组 B:0 1 3 5 8 (已经排序了)
对数组排序,找到最终数组B的第i个(假设i=0)元素在原始数组A中的下标的位置4,然后将最终数组B元素B[0](B[0]在例子中就是元素0)放到原始数组A下标为0的地方,就把第一个元素的位置给搞定了.如果某一个元素()在最终数组B中的位置和在原始数组中的位置一样的话,就说明不用换位置,直接跳过.然后依次遍历(就是不断地进行i=1,2,3...)的情况,直到遍历结束.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int findPosIndex(vector<int> nums, int target){
for (int i = 0; i <= nums.size() - 1; i++){
if (nums[i] == target){
cout << "pos: " << i << endl;
return i;
}
}
return -1;
}
vector<int> nums_ori;
void sortWithLeastExchange(vector<int> &nums){
nums_ori = nums;
int count = 0;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size() - 1; i++){
int posIndex = findPosIndex(nums_ori, nums[i]);
if (posIndex == i) continue;
cout << "exhange: " << nums_ori[i] << ":" << nums_ori[posIndex] << endl;
swap(nums_ori[i], nums_ori[posIndex]);
for (int i : nums_ori)
cout << i << "\t";
count++;
}
cout << count << endl;
}
int main()
{
vector<int> nums{ 8,3,5,1,0 };
sortWithLeastExchange(nums);
system("pause");
return 0;
}
原始数组 A: 8 3 5 1 0
最终数组 B:0 1 3 5 8 (已经排序了)
对数组排序,找到最终数组B的第i个(假设i=0)元素在原始数组A中的下标的位置4,然后将最终数组B元素B[0](B[0]在例子中就是元素0)放到原始数组A下标为0的地方,就把第一个元素的位置给搞定了.如果某一个元素()在最终数组B中的位置和在原始数组中的位置一样的话,就说明不用换位置,直接跳过.然后依次遍历(就是不断地进行i=1,2,3...)的情况,直到遍历结束.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int findPosIndex(vector<int> nums, int target){
for (int i = 0; i <= nums.size() - 1; i++){
if (nums[i] == target){
cout << "pos: " << i << endl;
return i;
}
}
return -1;
}
vector<int> nums_ori;
void sortWithLeastExchange(vector<int> &nums){
nums_ori = nums;
int count = 0;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size() - 1; i++){
int posIndex = findPosIndex(nums_ori, nums[i]);
if (posIndex == i) continue;
cout << "exhange: " << nums_ori[i] << ":" << nums_ori[posIndex] << endl;
swap(nums_ori[i], nums_ori[posIndex]);
for (int i : nums_ori)
cout << i << "\t";
count++;
}
cout << count << endl;
}
int main()
{
vector<int> nums{ 8,3,5,1,0 };
sortWithLeastExchange(nums);
system("pause");
return 0;
}
相关文章推荐
- 只含0、1的串进行排序,可任意交换位置,最小交换次数
- 有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 华为面试题(8分钟写出代码) 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 每天学习一算法系列(29)(有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小)
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】
- 【华为】题目:有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求: 通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。
- 华为面试题(8分钟写出代码) 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- [微软]有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- [微软]有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 华为面试题 题目:有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 有两个序列a,b,大小都为 n,序列元素的值任意整数,无序 通过交换a,b中的元素,使序列 a的和与序列b的和之间的差最小
- 写正确函数需要注意的地方:两个序列a,b,大小都为n,序列元素的值为任意整数,无序;要求通过交换a,b中的元素,使序列a元素的和与序列b元素的和之间的差最小
- 《数组-规划》 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- java编程:两个无序数组a和b,交换a,b中的元素,使得[序列a元素的和]与[序列b元素的和]之间的差最小。