折半插入排序
思路分析:通過對直接插入排序算法進行思考,我們可以知道插入排序方式首先需要為要插入的元素找到插入序列中合適的插入位置。通過折半((low+high)/2=mid)的方式,憑借一個mid來使得我們通過二分插入區的方式,不斷縮小插入的區域,直到low>high時,我們即可找到元素的插入位置high+1。此種方式在時間復雜度上仍和直接插入排序算法處於同一個等級,但由於使用了折半的方式,所以在為插入元素尋找插入位置時會更加高效(尤其在數據量較大時)。
時間復雜度:最壞情況(整個序列逆序時)時間復雜度為O(n2),最優情況(整個序列初始順序,從大到小時)時間復雜度為O(nlog2n),平均情況時間復雜度為O(n2)。
源代碼:
void BinaryInsertSort(int R[],int n)
{
int i,j,low,mid,high,temp;
for(i=1;i<n;i++)
{
low=0;
high=i-1;
temp=R[i];
while(low<=high) //找到合適的插入位置high+1,如果中間位置元素比要插入元素大,則查找區域向低半區移動,否則向高半區移動
{
mid=(low+high)/2;
if(R[mid]>temp)
{
high=mid-1;
}
else
{
low=mid+1;
}
}
for(j=i-1;j>=high+1;j--) //high+1后的元素后移
{
R[j+1]=R[j];
}
R[j+1]=temp; //將元素插入到指定位置
}
}