先上图,看图比较容易理解:
过程分析
1.选择一个元素构建一个已排好序的数组,这里为了方便选择第一个元素,(此例中黄色区域为以排好序的数组 )
2.然后让未排序部分的第一个元素k与已排好序中最后一个元素sorted[i]开始比较大小:
1).如果k >= sorted[i] , k加入到已排序数组后面。
2).如果k < sorted[i] , k继续和sorted[i--]比较大小
①当sorted[i--]< k <sorted[i]时,从sorted[i]开始,依次向后挪一位,k插入sorted[i]原来的位置。
②当sorted[i]前面已经没有元素时,k插入成为已排序数组第一个元素,元素一次向后挪一位
3.最后所有的未排序数组元素全部插入已排序数组部分,插入排序操作结束。
代码实现(C++)
#include<stdio.h>
#include<iostream>
using namespace std;
int insertSort(int arr[], int size){
int i, j, k;
for(i = 1; i < size; i++){
k = arr[i];
j = i-1;
// 如果未排序部分的第一个元素比一排好序部分的最后一个大,则直接加到后面
//未排序部分的第一个元素和已排好序部分元素从后往前一次比较,寻找插入位置
while(k < arr[j] && j>=0){
arr[j+1] = arr[j];
j = j-1;
}
arr[j+1]= k;
}
}
void printArray(int arr[], int size) {
int i;
for (i = 0; i < size; i++) cout << arr[i] << " ";
cout << endl;
}
int main() {
int arr[] = {10, 7, 82, 9, 13, 5, 2, 34, 54, 3, 26, 6, 37, 6, 48, 11};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "Prepare Sorted array: \n";
printArray(arr, n);
insertSort(arr, n);
cout << "insertSorted array: \n";
printArray(arr, n);
return 0;
}