InsertSort
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\n",sub); return 0; }
永远渴望,大智若愚(stay hungry, stay foolish)