Yonker's Blog

码农,程序猿,未来的昏析师

0%

八大排序算法之直接插入排序

基本思想

将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。
###要点
设立哨兵,作为临时存储和判断数组边界之用。

算法的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.zyg.sort;

public class StraightInsertSortAlgorithm
{
// 直接插入排序
public static void insertSort(int a[], int len)
{
for (int i = 1; i < len; i++)
{
// 如果第i个元素比它前面的元素小
if (a[i] < a[i - 1])
{
int j;
// 记录第i个元素值
int temp = a[i];
// 找到小于第i个元素值的位置,并将其前面元素后移
for (j = i - 1; j >= 0 && a[j] > temp; j--)
a[j + 1] = a[j];
// 将第i个元素插入到找到的位置
a[j + 1] = temp;
}
}
}

// 打印数组
public static void printArray(int a[])
{
for (int i = 0; i < a.length; i++)
{
System.out.println(a[i]);
}
}

public static void main(String[] args)
{
// 定义初始化数组
int a[] =
{ 4, 3, 6, 7, 33, 15, 90, 65, 777, 50 };
// 进行希尔排序
insertSort(a, a.length);
// 打印数组
printArray(a);
}
}

效率

时间复杂度

平均情况:O(n2)
最好情况:O(n)
最坏情况:O(n2)

空间复杂度

O(1)

稳定性

稳定