直接插入排序
1. 基本思想
直接插入插排的基本思想是:当插入第i(i >=1)时,前面的V[0],V[1],……,V[i-1]已经排好序。这时,用V[I]的排序码与V[i-1],V[i-2],…的排序码顺序进行比较,找到插入位置即将V[i]插入,原来位置上的元素向后顺移。
在图中给出了直接插入排序的过程。设在元素表中有n =6个元素,为了使描述书简介直观,在图中只画出各元素的排序码。其中有两个排序码相同,前一个直接写为25,后一个标记为25*。假定其中V[0],…,V[i-1]已经是一组有序的元素,V[i],V[i+1],……,V[n-1]是带插入的元素。排序过程从i = 1起,每执行完一趟之后i增加1,把第i各元素插入到前面有序的元素序列中去,使插入后的元素序列V[0],V[1],……,V[i-1]仍保持有序。
图(b)是一趟排序过程(i =4)的示例。此时,从V[0]到V[3]已经排好序,算法先比较V[4]与V[3],因为V[4]<V[3],因此需要到V[3]到V[0]中寻找插入位置,为此需要将V[4]放到一个临时变量temp中暂存,放置前面的元素后移时把它覆盖掉;然后从后向前依次比较寻找插入的位置。设循环变量为j,如果V[j]的排序码大于temp的排序码,就将V[j]后移,直到某一个V[j]小于或等于temp的排序码或元素的序列比较完为止,最后把暂存于temp中的原来的元素V[i]反填到第j个位置的后一个位置,一趟排序就结束了。引用https://blog.csdn.net/qq_37623612/article/details/80312121
2. 源代码
void InsertSort(ELemType A[ ],int A[ ]){
int i,j;
for(i=2;i<=n;i++)
if(A[i]<A[i-1]){
A[0]=A[i];
for(j=i-1;A[0]<A[j];- -j)
A[j+1]=A[j];
A[j+1]=A[0];
}
}
3.性能
(1)空间复杂度:O(1)
(2)时间复杂度:
- 最好:原本有序O(n)
- 最坏:原本逆序O(n²)
- 平均:O(n²)