刚开始学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;
}