----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
在前面已经粗略的接好了排序算的的种类和分类,并且也对排序算法进行了简单对比,现在就排序算法中的插入排序进行解读。
插入排序是一种简单直观的排序算法,其基本思想是在于每次讲一个待排序的记录按照关键字大小插入到前面已经排好序的子数列中,知道全部的记录插入完成。
由插入排序的思想可以引申出三个重要的排序算法:直接插入排序、折半插入排序和希尔排序,下面一一解读。
一、直接插入排序
假设待排序表为L[1.....n],为了实现L(i)插入到有序的子数列L[1......i-1]中,我们需要执行以下操作(假设L[]表示一个表,L()表示一个元素):
1)、查找出L(i)在L[1,,,,,i-1]中插入位置k。
2)、将L[k.....i-1]中所有的元素全部后移一个位置。
3)、将L(i)复制到L(k)。
则其直接插入排序的代码如下(只写方法的代码):
public void InsertSort(int A[],int n){
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];
}
}
直接插入排序的性能分析如下:
空间效率:仅仅使用了常熟个辅助单元,因而空间复杂度为O(l);
时间效率:时间复杂度为O(n2);
稳定性:为稳定的排序算法;
适用性:适用于顺序存储和连式存储的线性表。
二、折半插入排序
折半插入排序只需要做两件事情:(1)、从前面的字表中查找出待插入元素应该被插入的位置;(2)、给出插入位置腾出空间,将待插入的元素复制到表中的插入位置。
其算法代码如下:
public void InsertSort(int A[],int n){
int i,j,low,high,mid;
for(i=2;i<=n;i++)
A[0]=A[i];
low=1;high=i-1;
while(low<=high){
mid=(low+high)/2;
if(A[mid]>A[0]) high=mid-1;
else low=mid+1;
}
for(j=i-1;j>=high+1;--j)
A[j+1]=A[j];
A[high+1]=A[0];
}
其中:
空间效率:由于排序减少了比较元素的次数,约为O(nlog2n);
时间效率:时间复杂度为O(n2);
稳定性:是一个稳定的排序算法。
三、希尔排序
希尔排序是先选定补偿,即将表分成形如:L[i,i+d,i+2d.......i+kd]的特殊子表,分别进行直接插入排序,等到整个表呈现基本有序时,在对全体记录进行一次直接插入排序。
它的基本算法的核心代码是:
public void ShellSort(int A[],int n){
int dk;//作为前后记录位置的增量是dk;
for(dk=len/2;dk>=1;dk=dk/2)
for(i=dk+1;i<=n;++i)
if(A[i]<A[i-dk]){
A[0]=A[i];
for(j=i-dk;j>0&&A[0]<A[j];j-=dk)
A[j+dk]=A[j];
}
}
当然,希尔排序的性能分析如下:
空间效率:仅使用了常熟个辅助单元,因而空间复杂度为O(l)。
时间效率:时间复杂度仍然是O(n20)。
稳定性:希尔排序不是稳定的算法;
适用性:希尔排序适用于当线性表为顺序存储的情况。
以上便是插入排序的相应解读,希望能够对大家有所帮助,顺带着自己也有所提高。希望大家都能共同进步,同时期冀大家多多关注我,我会后续解读其他的排序算法。
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
详情请查看: