插入排序
排序原理
这是一种简单的插入排序法,基本思想是:把待排序的记录按其关键码值的大小逐个插入到一 个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。
直接插入排序
在一个排序数组中,将第一个元素看作排序序列中的唯一元素,申请一个空间存放将要插入的元素,然后将要插入的元素与这个元素比较,根据排序条件确定要插入元素插入的位置,有序序列元素加一,申请空间里放下一个要插入的元素,再次和有序序列中的元素比较(从后往前),确定要插入的位置,比其大的元素依次往后移动一位。
代码实现
void insertSort2(int a[],int size){
if(size==0) return;
for(int i=1;i<size;i++){
int k=a[i];
int end=i-1;
while(a[end]>k&&end>=0){
a[end+1]=a[end];
end--;
}
a[end+1]=k;
}
}
直接插入排序的特性总结:
- 元素集合越接近有序,直接插入排序算法的时间效率越高
- 时间复杂度:O(N^2)
- 空间复杂度:O(1),它是一种稳定的排序算法
- 稳定性:稳定
稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法是稳定的;否则称为不稳定的。
折半插入排序
在插入数据过程中,比较次数可能会比较多,我们可以将直接查找的方改为折半查找,即可得到折半插入排序算法,相比于直接插入排序,有一定的优化。
void insertSort2(int a[],int size){
if(size==0) return;
for(int i=1;i<size;i++){
int k=a[i];
int left=0;
int right=i-1
int end=i-1;
while(left<=right){
int mid=left+(right-left)>>1;
if(a[mid]>k)
right=mid-1;
else
left=mid+1;
}
while(left<=end){
a[end+1]=a[end];
end--;
}
a[end+1]=k;
}
}