概念
输入: n个数的一个序列(a1,a2,…,an)。
输出: 输入序列的一个排列(a1’,a2’,…,an’>,满足a1’≤a2’≤…≤an’。
图解过程
核心算法
int i,j,key;
for(i=1; i<arr.length; i++){
key = arr[i];
j=i-1;
while(j>=0 && arr[j]>key){
arr[j+1] = arr[j];
j--;
}
arr[j+1] = key;
}
算法实现
Java
import java.util.Scanner;
public class InsertSort {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入整数数组大小:");
int size = s.nextInt();
int[] arr = new int[size];
System.out.println("请开始输入整数数组:");
for(int i = 0 ; i<size ; i++){
arr[i] = s.nextInt();
}
System.out.println("插入排序升序排序结果如下:");
for (int i : sortByInsertAsc(arr)) {
System.out.print(i+"\t");
}
System.out.println("\n插入排序降序排序结果如下:");
for (int i : sortByInsertDesc(arr)) {
System.out.print(i+"\t");
}
}
/**
* Insert sort algorithm. ASC
* @param arr
* @return
*/
public static int[] sortByInsertAsc(int[] arr){
int i,j,key;
for(i=1; i<arr.length; i++){
key = arr[i];
j=i-1;
while(j>=0 && arr[j]>key){
arr[j+1] = arr[j];
j--;
}
arr[j+1] = key;
}
return arr;
}
/**
* Insert sort algorithm. DESC
* @param arr
* @return
*/
public static int[] sortByInsertDesc(int[] arr){
int i,j,key;
for(i=1; i<arr.length; i++){
key = arr[i];
j=i-1;
while(j>=0 && arr[j]<key){
arr[j+1] = arr[j];
j--;
}
arr[j+1] = key;
}
return arr;
}
}
输出结果:
请输入整数数组大小:
9
请开始输入整数数组:
89
32
4
56
78
12
104
89
67
插入排序升序排序结果如下:
4 12 32 56 67 78 89 89 104
插入排序降序排序结果如下:
104 89 89 78 67 56 32 12 4
C
#include <stdio.h>
int main(){
int size = 9;
//scanf("Please input int array of size:%d\n", &size);
int arr[size];
printf("%s\n", "Please input numbers:");
for (int i = 0; i < size; i++) {
scanf("%d\n", &arr[i]);
}
//insertSort
int i,j,key;
for (i = 1; i < size; i++) {
key = arr[i];
j=i-1;
while (j>=0 && arr[j]>key) {
arr[j+1]=arr[j];
j--;
}
arr[j+1]=key;
}
//traverse array
printf("%s\n", "New array is :");
for (int i = 0; i < size; i++) {
printf("%d\n", arr[i]);
}
return 0;
}