活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
今天主要给大家分享 折半插入排序
相关的知识点,希望通过通俗易懂的语言和大家一起学习,一起进步。针对折半插入排序可以类比排序排序算法。其实,折半插入排序,就是对插入排序算法的一种改进。它是一种稳定的排序算法。为什么说稳定呢?因为折半插入查找只是减少了比较次数,不会更改元素的位置。在执行速度上,要快于直接插入排序。
1. 算法思想
有N个数据待排序,将数据分为有序数据和无序数据,第一次排序时默认a[0]为有序数据,a[1]~a[n-1]为无序数据。有序数据分区的第一个元素位置为low,最后一个元素的位置为high。
具体执行过程如下:
将一个新元素插入已排好序的数组的过程中,寻找插入点时,将待插入区域的首元素设置为a[low],末元素设置为a[high],则每轮比较时将待插入元素与 a[mid],其中 mid=(low+high)/2相比较,如果比参考元素小,则选择 a[low] 到 a[mid-1] 为新的插入区域( 即high=m-1),否则选择a[m+1]到a[high]为新的插入区域(即low=mid+1),如此直至 low<=high 不成立,即将此位置之后所有元素后移一位,并将新元素插入 a[high+1]。
2.伪代码
for i = 2 to A.length
if A[i] < A[i - 1]
tmp = A[i]
low = 0
high = i - 1
while low <= high
mid = (low + high) / 2
if A[mid] > tmp
high = mid - 1
else
low = mid + 1
for j = i - 1 downto high + 1
A[j + 1] = A[j]
A[high + 1] = tmp
3. 核心代码实现
3.1 Java版
public class HalfSearchSort {
public void sort(int[] array){
int temp;
for(int i = 1; i < array.length; i++){
int low = 0;
int hight = i-1;
temp = array[i];
while(hight>=low){
int mid = ( low + hight ) / 2;
if (array[mid] > temp){
hight = mid - 1;
}else{
low = mid + 1;
}
}
for (int j = i-1; j > hight; j--) {
array[j+1] = array[j];
}
array[hight+1] = temp;
}
}
}
3.2 Python 版
def halfSearchSort():
for node in arr:
end = len(list)
start = 0
mid = end // 2
if 0 != end:
while True:
if node > list[mid]:
start = mid + 1;
else:
end = mid;
mid = start + (end - start) // 2
if start >= end:
break;
list.insert(start, node)
4. 算法效率分析
4.1 时间复杂度
如果输入的元素是反向有序,那么每次都需要进行位置查找,由于区间每次都缩减一半,所以得到寻找位置的次数最多为logi,但是移动元素的次数没有变,所以时间复杂度依然为O(n^2)。
4.2 空间复杂度
算法在执行过程中,只需要额外的变量记录关键信息,所以空间复杂度为O(1)。
欢迎小伙伴们,留言,私信。