在插入的基础上将比较次数进行优化。。
不需要跟有序序列的所有数据进行比较,每次都是跟其中的最中间的书进行比较,比中间的值大,则将查找区间缩短为它的后半部分,否则缩短为它的前半部分。如此不断重复进行。直至找到它的正确位置。。。然后将比他的有序数据都想后移动记录(都移动一位)。。将他插入到对应的位置。。。
void mildsort(int *a,int n)
{
int i=0,j=0;
int low=0,high=0,m=0;
int temp=0;
for(j=1;j<n;j++)
{
temp=a[j] ;
low=0 ;high=j-1;
while(low<=high) //折半查找部分。。。
{
m=(low+high)/2;
if(temp<=a[m]) {high=m-1;}; //必须保函等于号,否则有相同的数据会陷入死循环
else low=m+1;
}
for(i=j;i>=low;i--) {a[i]=a[i-1];}; //从第J个(也就是无序部分第一个开始逐一的向后移动一个位置,)
a[low]=temp; //将空出来的位置插入temp。
}
}
先将第一个数据看没有序序列,然后逐步扩大有序序列,缩短无序序列。
注意 :
在折半查找中(先不考虑有相同数据的情况)最终肯定是在两个数据中间,由于m的取值是向下取值(当缩减到两个数据时,m会指向low,则最后一次的比较一定会是low 与 m的值相比较即"temp>a[m]";low的最终会指向两个数据中较大的那个,估下一步需要从low 的值开始向后移动记录。。)
折半查找只是优化了查找的方式,查找的时间复杂度减少到?????。。。而插入的方式并没有改变时间复杂度依旧是O(nn);最坏的情况(全部逆序)移动次数为【n(n-1)】/2。。。。