C语言---排序算法7---折半插入排序

文章目录

折半插入排序(Binary Insertion Sort)是插入排序的一种优化版本,通过二分查找确定插入位置,减少了比较次数,从而提升排序效率。

1. 算法步骤

1、初始状态:将数组分为已排序部分(初始为第一个元素)和未排序部分。

2、遍历未排序部分:

对当前元素 key,在已排序部分中使用二分查找确定插入位置 pos。

将 pos 之后的元素向后移动一位,腾出空间。

将 key 插入到 pos 位置。

3、重复:直到所有元素处理完毕。

2. 代码实现

以下代码通过二分查找寻找到需要插入的位置,在返回需要插入的位置后,移动数组。

c 复制代码
#include <stdio.h>

// 二分查找函数:在已排序数组arr[low..high]中找到key的插入位置
int binary_search(int arr[], int key, int low, int high) {
    while (low <= high) {
        int mid = low + (high - low) / 2;
        if (arr[mid] == key) {
            return mid; // 找到相等元素,返回其位置
        }
        if (arr[mid] < key) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }
    return low; // 未找到时返回第一个大于key的位置
}

// 折半插入排序函数
void binary_insertion_sort(int arr[], int n) {
    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int pos = binary_search(arr, key, 0, i - 1); // 在已排序部分查找插入位置
        // 移动元素:从pos到i-1的元素向后移动一位
        for (int j = i - 1; j >= pos; j--) {
            arr[j + 1] = arr[j];
        }
        arr[pos] = key; // 插入key到正确位置
    }
}

int main() {
    int arr[] = {37, 23, 0, 17, 12, 72, 31};
    int n = sizeof(arr) / sizeof(arr[0]);
    
    printf("原始数组: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    binary_insertion_sort(arr, n);
    
    printf("排序后数组: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    return 0;
}

4. 优缺点

4.1、优点:

1、减少比较次数,对大规模数据比普通插入排序更快。

2、稳定且原地排序。

4.2、缺点:

1、移动次数未优化。

2、对随机数据效率不如更高级的排序(如快速排序、归并排序)。

推荐视频

数据结构合集 - 折半插入排序(算法过程, 效率分析, 稳定性分析)

相关推荐
cpp_250117 分钟前
P10098 [ROIR 2023] 地铁建设 (Day 2)
数据结构·c++·算法·贪心·二分答案·洛谷题解
阳明山水1 小时前
TimesFM与Moirai MoE零样本预测解析
人工智能·深度学习·算法·机器学习·架构
铅笔侠_小龙虾1 小时前
Rust 学习(2)-变量、常量与 shadowing
学习·算法·rust
AI科技星1 小时前
基于全域数学公理体系的三元极值题最简求解法【乖乖数学】
线性代数·算法·游戏·决策树·机器学习·乖乖数学·全域数学
简单电磁炮2 小时前
硬件基础4
c语言
大鱼>2 小时前
宠物异常行为预警系统:边缘计算与实时检测
人工智能·深度学习·算法·iot·宠物
apcipot_rain3 小时前
某双非机试真题
算法
米尔的可达鸭3 小时前
深入操作系统 Socket 底层:套接字控制块、FD映射、阻塞IO核心完整实现
arm开发·数据结构·websocket·网络协议·算法·架构·安全架构
tachibana24 小时前
hot100 课程表(207)
java·数据结构·算法·leetcode
神仙别闹4 小时前
编写基于C++ Huffman 算法的无损压缩程序和解压程序
java·c++·算法