插入排序的主要思想就是通过不断将待排序的元素插入到有序序列中,并不断的是有序序列扩大直至所有的元素都进入序列中,
插入排序一般包括直接插入排序、折半插入排序、二路插入排序、表插入排序、希尔排序
直接插入排序
定义在排序过程中,记录序列R[1..n]的状态为:
有序序列R[1...i-1] | R[i] | 无序序列R[i+1...n] |
插入排序的基本思想就是将R[i]插入到有序子序列有序序列R[1...i-1]中,使有序序列变为有序序列R[1...i],
举例说明
初始关键子序列: [51] 33 62 96 87 17 28 51 |
i = 2(33) [33 51] 62 96 87 17 28 51 |
i = 3(62) [33 51 62] 96 87 17 28 51 |
i = 4(96) [33 51 62 96] 87 17 28 51 |
i = 5(87) [33 51 62 87 96] 17 28 51 |
i = 6(17) [17 33 51 62 87 96] 28 51 |
i = 7(28) [17 28 33 51 62 87 96] 51 |
i = 8(51) [17 28 33 51 51 62 87 96] |
算法描述
#define n 待排序记录的个数
typedef struct
{
int key;
} RecType;
void StrSort(RecRType R[] ,int n)
{
for (i =2;i<= n; i++) {
R[0] = R[i];
j=i-1;
while(R[0].key < R[j].key) {
R[j+1] = R[j]; j--;
}
R[j+1] = R [0];
}
}
直接插入排序的最好情况下,时间复杂度为O(n)
最坏的情况下和平均时间复杂度为O(n2)