交换任意两个元素进行排序进行的最小交换次数

本文介绍了一种通过最少次数的元素交换实现数组排序的方法。该方法首先对数组进行完全排序,然后查找已排序元素在原始数组中的位置,并进行必要的交换以使原始数组达到排序状态。文章提供了一个具体的示例和C++实现代码。

核心思路 :

原始数组  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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值