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

核心思路 :

原始数组  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;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
比较直接插入排序、希尔排序、直接选择排序、堆排序、起泡排序、快速排序、归并排序、基数排序。随机生成一组待排序数据,个数不少于100个;各种算法对同一数据排序所需要的关键字比较次数和关键字移动次数,至少使用5组数据进行比较。1)插入排序:每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。 2)冒泡排序比较待排序数据元素的大小,发现个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。 3)选择排序:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 4)Shell排序:在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为 增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。 5)归并排序:设有个有序(升序)序列存储在同一数组中相邻的位置上,不妨设为A[l..m],A[m+1..h],将它们归并为一个有序数列,并存储在A[l..h]。 6)快速排序:快速排序是对冒泡排序的一种本质改进。它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少1。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右边的数,直到基准点的左右只有一个元素为止。 7)堆排序:堆排序是一种树形选择排序,在排序过程中,将A[n]看成是完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。 8)基数排序:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值