插入排序法:ALDS1_1_A:Insertion Sort

这里写图片描述
这里写图片描述
  请编写一个程序,用插入排序法将包含N个元素的数列A按升序排列。程序中需包含上述伪代码所表示的算法。为检验算法的执行过程,请输出个计算步骤的数组(完成输入后的数组,以及每次i自增后的数组)。

  • 输入 在第1行输入定义数组长度的整数N。在第2行输入N个整数,以空格隔开。
  • 输出 输出总共有N行。插入排序法每个计算步骤的中间结果各占用1行。数列的各元素之间空一个空格。请注意,行尾元素后的空格等多余的换行会被认定为Presentation Error。
  • 限制 1<=N<=100
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    C语言版本:
#include<stdio.h>

/*按顺序输出数组元素*/
void trace(int A[],int N){
    int i;
    for(i=0;i<N;i++){
        if(i>0) 
            printf(" ");/*在相邻元素之间输出1个空格*/
        printf("%d",A[i]); 
    }
    printf("\n");
} 

/*插入排序(0起点数组)*/
void insertionSort(int A[],int N){
    int i,j,v;
    for(i=1;i<N;i++){
        v=A[i];
        j=i-1;
        while(j>=0&&A[j]>v){
            A[j+1]=A[j];
            j--;
        }
        A[j+1]=v;
        trace(A,N);
    }
} 

int main(){
    int N,i,j;
    int A[100];

    scanf("%d",&N);
    for(i=0;i<N;i++)
        scanf("%d",&A[i]);

    trace(A,N);
    insertionSort(A,N);

    return 0;
}

python版本:

n = int(input()) #输入待排序元素个数
k = [int(i) for i in input().split()] #k是一个列表,列表中每个元素以空格隔开

for i in range(n):
    v = k[i]
    j = i-1
    while j >= 0 and k[j] > v:
        k[j+1] = k[j]
        j-=1
    k[j+1] =v
    print(' '.join(map(str, k))) #map将列表转换为字符串,join将字符串用空格隔开,连接成一个新的字符串。

java版本:

package aizu;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Insert{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        /*从标准输入流System.in中直接读取使用者输入时,使用者每输入一个字符,System.in就读取一个字符。
                    为了能一次读取一行使用者的输入,使用了BufferedReader来对使用者输入的字符进行缓冲。 
          System.in是一个位流,为了转换为字符流,可使用InputStreamReader为其进行字符转换,
                    然后再使用BufferedReader为其增加缓冲功能 
         */
        int n = Integer.parseInt(br.readLine());
        /*readLine()方法会在读取到使用者的换行字符时,再一次将整行字符串传入。 */
        int[] a = new int[n];
        String[] t = br.readLine().split(" ");
        for(int i = 0; i < n; i++){
            a[i] = Integer.parseInt(t[i]);
        }
        insertionSort(a, n);
    }

    public static void insertionSort(int[] a, int n){
        int i, j, v;
        StringBuilder sb = new StringBuilder();
        for(i = 0; i < n; i++){
            sb.append(a[i]);
            if(i != n-1)sb.append(" ");
            if(i == n-1)sb.append("\n");
        }
        for(i = 1; i < n; i++){
            v = a[i];
            j = i - 1;
            while(j >= 0 && a[j] > v){
                a[j+1] = a[j];
                j--;
            }
            a[j+1] = v;
            for(int k = 0; k < n; k++){
                sb.append(a[k]);
                if(k != n-1) sb.append(" ");
                //System.out.println(sb);                                           
                //sb.delete(0, sb.length());                                        
                if(k == n-1) sb.append("\n");
            }
        }
        System.out.print(sb);
    }
}

javascript版本:

function main(input) {
  input = input.split("\n");
  var N = parseInt(input[0]);
  var values = input[1].split(" ").map(function(v) { return parseInt(v); });
  insertionSort(values);
}

function insertionSort(a) {
  for (var i = 0; i < a.length; i++) {
    for (var j = i-1; j >= 0; j--) {
      if (a[j+1] < a[j]) {
        var v  = a[j];
        a[j]   = a[j+1];
        a[j+1] = v;
      }
    }
    console.log(a.join(' '));
  }
}
main(require("fs").readFileSync("/dev/stdin", "utf8"));

php版本:

<?php

fscanf(STDIN, '%d', $N);
$line = trim(fgets(STDIN));
$arr = explode(' ', $line);

echo implode(' ', $arr), PHP_EOL;
for ($i = 1; $i < $N; $i++) {
    $tmp = $arr[$i];
    if ($arr[$i - 1] > $tmp) {
        $j = $i;
        do {
            $arr[$j] = $arr[$j - 1];
            $j--;
        } while ($j > 0 && $arr[$j - 1] > $tmp);
        $arr[$j] = $tmp;
    }
    echo implode(' ', $arr), PHP_EOL;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值