求完成排序最少的对换次数

刚开始学C++实在找不到答案,要么就是错的
Description
山迪要出席一个周末表演晚会,他在会上要表演卡片魔术。他有n(0<n≤100)张卡片,每张卡片上都标明了1~1000之间的某个数字,这n张卡片本来是有序的,可是山迪的助手不小心把卡片打乱了。这可急坏了山迪,忙令助手迅速通过一些操作把这些卡片变回有序的,而山迪的助手是个思想简单的人,他能做的操作只有一种:交换任意两张卡片的位置。
现在,山迪想知道助手最少交换几次可以达到目的,以便尽快决定是否替换这个魔术表演,聪明的你能帮助他么?

Input
第1行是一个正整数n,第2行n个是打乱顺序后、每张卡片上的数字。

Output
输出所需要的最少交换次数

Sample Input
5
1 4 7 8 3
Sample Output
3

#include<iostream>
 using namespace std;
 const int N=10005;
 int n;
 int a[N];
 int num;

 void selectSort(){
     int minIndex;
     for(int i=0;i<n-1;i++){
         minIndex=i;
         for(int j=i+1;j<n;j++){
             if(a[j]<a[minIndex]){
                 minIndex=j;
            }
        }
        if(i!=minIndex){
            swap(a[i],a[minIndex]);
            num++;
        }
    }    
 }
 void solve(){
     num=0;
     selectSort();
     printf("%d\n",num);    
 }
 int main(){
 scanf("%d",&n);
     for(int i=0;i<n;i++){
         scanf("%d",&a[i]);
     }
     solve();

     return 0;
 } 


#include <stdio.h>

int main()
{
    int i, j, n, m, t;
    int count = 0;
    int a[100];
    scanf("%d", &n);
    for(i=0; i<n; i++) {
        scanf("%d", &a[i]);
    }
    for(i=0; i<n; i++) {
        // 每一轮找出最大的数,将其放在最后
        m = 0;
        for(j=0; j<n-i-1; j++) {
            if(a[j] > a[m]) {
                m = j; // 找到并记录最大的一个数
            }
        }
        if(m > 0 && m < n-i-1) { // 把最大的数与最后一个元素交换
            t = a[n-i-1];
            a[n-i-1] = a[m];
            a[m] = t;
            count++;
        }
    }
    printf("%d\n", count);

    return 0;
}