折半插入排序PPT课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int low = 1;
int high = i - 1;
while (low <= high) {
பைடு நூலகம்
// 在arr[low..high]中折半查找有序插入的位置
int m = (low + high) / 2;
// 折半
if (arr[0].key < arr[m].key) // 关键字相同时,使low = m + 1,到高半区,保证稳定性
high = m - 1;
// 插入点在低半区
else
low = m + 1;
// 插入点在高半区
}
for (int j = i - 1; j >= high + 1; --j)
arr[j + 1] = arr[j];
// 记录后移
arr[high + 1] = arr[0]; // 插入
}
}
2020/1/14
8
折半插入排序
binary insertion sort
基本概念
折半插入排序(binary insertion sort)是对插入排序算法的一种改 进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的 序列中。由于前半部分为已排好序的数列,这样我们不用按顺序依次寻 找插入点,可以采用折半查找的方法来加快寻找插入点的速度。
2020/1/14
5
算法如下:
void BInsertSort(Record *arr, int length) // length是要排序的元素的个数,0号单元除外
{
for (int i = 2; i <= length; ++i) {
arr[0] = arr[i];
// 将arr[i]暂存到arr[0]
稳定性及复杂度
折半插入排序算法是一种稳定的排序算法,比直接插入算法明显 减少了关键字之间比较的次数,因此速度比直接插入排序算法快,但 记录移动的次数没有变,所以折半插入排序算法的时间复杂度仍然为 O(n^2),与直接插入排序算法相同。附加空间O(1)。
折半插入算法与直接插入不同是:
不是比的过程,那是插的过程。二分排序想名字就是把有序的东西分 成2半。比如说 你向1 2 3 4 5 6这个有序序列插入4,你怎么插,你 可以先和6比,在和5比这样可以做。但是作为一个有序序列你如果和 中间比,如果比中间大就和后面那一部分比,然后后面又找中间部分。 在平均的情况下比直接插这比要快。
具体操作
在将一个新元素插入已排好序的数组的过程中,寻找插入点时, 将待插入区域的首元素设置为a[low],末元素设置为a[high],则轮比 较时将待插入元素与a[m],其中m=(low+high)/2相比较,如果比参考元 素大,则选择a[low]到a[m-1]为新的插入区域(即high=m-1),否则选择 a[m+1]到a[high]为新的插入区域(即low=m+1),如此直至 low<=high不成立,即将此位置之后所有元素后移一位,并将新元素 插入a[high+1]。