1 Insertion Sort(40分)
题目内容:
實作插入排序法讓一個序列的數字遞增,並輸出數字總共交換了幾次。
比如說一個序列1 3 7 9 2,前四個數字都已經排好了,這時候第五個數字2進來,他必須跟9,7,3交換使得序列變成1 2 3 7 9。這個數字2的交換次數就是3次。
输入格式:
輸入第一行為一個數字T,代表測試資料的筆數。接下來有T筆測資,每筆測資第一行為一個正整數N,表示這筆測資有N個數字。每筆測資的第二行會有N個數字,每個數字間以空格隔開。
數字範圍:
0 < N <= 100
0 <= 序列內的數字 <= 1000000
输出格式:
輸出一行數字,將每筆測資的答案加總後輸出。
输入样例:
3
5
5 4 3 2 1
3
1 2 3
6
1 3 5 2 4 6
输出样例:
13
时间限制:500ms内存限制:32000kb
第一次真正意义上自己调试成功的代码
Insert Sort
A[5] = {1, 3, 2, 5 , 4}
for i = 1 to i < n
x = A[i] 将a[i]拿出
for j = i - 1 to 0
if a[j] > a[i]
a[j]向后移动一位
else
x = a[j + 1]
if i < 0
a[0] = x
#include <iostream>
#include <cstdio>
#include <algorithm>
#define M 100000
using namespace std;
int i,j;
int main()
{
int n,sub,m,num[M];
int flag;
sub = 0;
scanf("%d",&n);
while(n--)
{
int ans = 0;
scanf("%d",&m);
for( i = 0; i < m; i++ )
scanf("%d",&num[i]);
/*InsertSort*/
for( i = 1; i < m; i++)
{
flag = num[i];
for( j = i-1; j >= 0; j--)
{
if( flag < num[j] )
{
num[j+1] = num[j];
ans++;
}
else
{
num[j+1] = flag;
break;
}
}
if (j < 0)
num[0] = flag;
}
sub += ans;
}
// for( i = 0; i < m; i++ )
// printf("%d ",num[i]);
printf("%d
",sub);
return 0;
}