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
",sub);

    return 0;
}

  

永远渴望,大智若愚(stay hungry, stay foolish)
原文地址:https://www.cnblogs.com/h-hkai/p/7833198.html