
插入排序
是一种简单的排序算法,其工作原理类似于对手中的扑克牌进行排序。
该数组实际上分为已排序部分和未排序部分。
未排序部分的值被拾取并放置在已排序部分的正确位置。
插入排序算法
要按升序对大小为 N 的数组进行排序,请迭代数组并将当前元素(键)与其前一个元素进行比较,如果键元素小于其前一个元素,则将其与之前的元素进行比较。
将较大的元素向上移动一位,为交换的元素腾出空间。
插入排序算法的工作原理
考虑一个例子: arr[]:
{12, 11, 13, 5, 6}
第一关:
-
这里,12 大于 11,因此它们不是按升序排列的,并且 12 也没有处于正确的位置。
因此,交换 11 和 12。
-
因此,目前 11 存储在已排序的子数组中。
第二遍:
-
这里,13大于12,因此两个元素看起来都是升序的,因此不会发生交换。
12 也与 11 一起存储在已排序的子数组中
第三遍:
-
现在,已排序的子数组中存在两个元素:
11
和
12
-
继续看接下来的两个元素,即 13 和 5
-
5 和 13 都没有出现在正确的位置,所以交换它们
第四遍:
-
现在,排序后的子数组中存在的元素是
5、11
和
12
-
移至接下来的两个元素 13 和 6
-
在这里,交换也使得 11 和 6 未排序,因此,再次交换
插图:

插入排序算法的实现
下面是迭代方法的实现:
-
C++
-
C
-
Java
-
Python
-
C#
-
PHP
-
JavaScript
C++
#include <bits/stdc++.h>
using namespace std;
void insertionSort(int arr[], int n)
{
int
i, key, j;
for (i = 1; i < n; i++) {
key = arr[i];
j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
void printArray(int arr[], int n)
{
int
i;
for (i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
}
int main()
{
int
arr[] = { 12, 11, 13, 5, 6 };
int
N = sizeof(arr) / sizeof(arr[0]);
insertionSort(arr, N);
printArray(arr, N);
return 0;
}
|
C
#include <math.h>
#include <stdio.h>
void insertionSort(int arr[], int n)
{
int
i, key, j;
for (i = 1; i < n; i++) {
key = arr[i];
j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
void printArray(int arr[], int n)
{
int
i;
for (i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
}
int main()
{
int
arr[] = { 12, 11, 13, 5, 6 };
int
n = sizeof(arr) / sizeof(arr[0]);
insertionSort(arr, n);
printArray(arr, n);
return 0;
}
|
Java
public class InsertionSort {
void
sort(int arr[])
{
int n = arr.length;
for (int
i = 1; i < n; ++i) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
static
void printArray(int arr[])
{
int n = arr.length;
for (int
i = 0; i < n; ++i)
System.out.print(arr[i] + " ");
System.out.println();
}
public
static void main(String args[])
{
int arr[] = { 12, 11, 13, 5, 6 };
InsertionSort ob = new InsertionSort();
ob.sort(arr);
printArray(arr);
}
};
|
Python
def insertionSort(arr):
for
i in range(1, len(arr)):
key = arr[i]
j = i-1
while j >=
0 and key < arr[j] :
arr[j + 1] = arr[j]
j -= 1
arr[j + 1] = key
arr = [12, 11, 13, 5, 6]
insertionSort(arr)
for i in range(len(arr)):
print
("% d" %
arr[i])
|
C#
using System;
class InsertionSort {
void
sort(int[] arr)
{
int n = arr.Length;
for (int
i = 1; i < n; ++i) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
static
void printArray(int[] arr)
{
int n = arr.Length;
for (int
i = 0; i < n; ++i)
Console.Write(arr[i] + " ");
Console.Write("\n");
}
public
static void Main()
{
int[] arr = { 12, 11, 13, 5, 6 };
InsertionSort ob = new InsertionSort();
ob.sort(arr);
printArray(arr);
}
}
|
PHP
<?php
function insertionSort(&$arr, $n)
{
for
($i = 1; $i < $n; $i++)
{
$key = $arr[$i];
$j = $i-1;
while ($j
>= 0 && $arr[$j] > $key)
{
$arr[$j
+ 1] = $arr[$j];
$j = $j
- 1;
}
$arr[$j
+ 1] = $key;
}
}
function printArray(&$arr, $n)
{
for
($i = 0; $i < $n; $i++)
echo $arr[$i]." ";
echo
"\n";
}
$arr = array(12, 11, 13, 5, 6);
$n = sizeof($arr);
insertionSort($arr, $n);
printArray($arr, $n);
?>
|
JavaScript
<script>
function insertionSort(arr, n)
{
let i, key, j;
for
(i = 1; i < n; i++)
{
key = arr[i];
j = i - 1;
while (j >= 0 && arr[j] > key)
{
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
function printArray(arr, n)
{
let i;
for
(i = 0; i < n; i++)
document.write(arr[i] + " ");
document.write("<br>");
}
let arr = [12, 11, 13, 5, 6 ];
let n = arr.length;
insertionSort(arr, n);
printArray(arr, n);
</script>
|
时间复杂度:
O(N^2)
辅助空间:
O(1)
插入排序的复杂度分析:
插入排序的时间复杂度
-
插入排序
最坏情况的
时间复杂度是
O(N^2)
-
插入排序的
平均情况
时间复杂度为
O(N^2)
-
最好情况
的时间复杂度
是
O(N)
。
插入排序的空间复杂度
插入排序的辅助空间复杂度为
O(1)
插入排序的特点
-
该算法是最简单的算法之一,实现也简单
-
基本上,插入排序对于小数据值是有效的
-
插入排序本质上是自适应的,即它适用于已经部分排序的数据集。
有关插入排序的常见问题
Q1.
插入排序算法的边界情况是什么?
如果元素按逆序排序,插入排序将花费最大时间进行排序。
当元素已经排序时,它需要最少的时间(n 的顺序)。
Q2。
插入排序算法的算法范式是什么?
插入排序算法遵循增量方法。
Q3。
插入排序是就地排序算法吗?
是的,插入排序是一种就地排序算法。
Q4。
插入排序是一种稳定的算法吗?
是的,插入排序是一种稳定的排序算法。
Q5.
什么时候使用插入排序算法?
当元素数量较少时,使用插入排序。
当输入数组几乎已排序并且完整的大数组中只有少数元素被放错位置时,它也很有用。