📜  二进制插入排序的C程序(1)

📅  最后修改于: 2023-12-03 14:49:02.137000             🧑  作者: Mango

二进制插入排序的C程序介绍

二进制插入排序是一种排序算法,它通过将待排序的数字转换为二进制形式,然后插入到已排序数组中正确的位置。此算法比插入排序算法更快。在这篇文章中,我们将学习如何实现二进制插入排序的C程序。

算法步骤
  1. 遍历无序数组
  2. 将当前元素转换为二进制字符串
  3. 在已排序的数组中查找待插入位置
  4. 插入当前元素到正确位置
  5. 重复1-4,直到无序数组中所有元素都被遍历
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 将整数转为二进制字符串并返回
char *binary(int num) {
    char *binary = (char *) malloc(33 * sizeof(char)); // 32位二进制+1位空字符
    itoa(num, binary, 2); // 转为二进制字符串
    return binary;
}

// 二进制插入排序实现
void binaryInsertionSort(int arr[], int n) {
    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int left = 0; // 有序数组左指针
        int right = i - 1; // 有序数组右指针
        while (left <= right) { // 二分查找
            int mid = (left + right) / 2;
            if (strcmp(binary(arr[mid]), binary(key)) < 0) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        // 有序数组中插入当前元素
        for (int j = i - 1; j >= left; j--) {
            arr[j + 1] = arr[j];
        }
        arr[left] = key;
    }
}

int main() {
    int arr[] = {7, 2, 5, 3, 1, 6, 4};
    int n = sizeof(arr) / sizeof(arr[0]);
    binaryInsertionSort(arr, n);
    printf("排序后的数组:\n");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}
解释说明

这个程序中,我们首先实现了一个名为binary的函数,它接受一个整数作为参数,将其转换为二进制字符串并返回。该函数内部使用了stdlib.h库中的itoa函数,它能够将整数转换为字符串。

接着,我们实现了二进制插入排序算法的主体,即binaryInsertionSort函数。我们使用了一个for循环遍历整个数组,对每一个元素进行操作。在for循环中,我们首先将当前元素作为key,定义了左指针left为0,右指针right为i-1(因为数组前i个元素已经是有序的了)。

然后,我们使用了二分查找算法,在有序的数组中查找待插入位置。在二分查找中,我们首先计算了mid(left和right的中间值),如果有序数组中mid对应的元素小于key,说明待插入位置在mid的右侧,我们将left指针右移即可;否则,待插入位置在mid的左侧,我们将right指针左移即可。最终,left指向的位置即为待插入位置。

最后,我们使用for循环将从left到i-1(包括left和i-1)的元素向右位移一位,为当前元素腾出位置,然后将key插入到left位置上,这样就完成了一次排序。

最后,我们在main函数中定义了一个无序数组arr,定义了数组长度n,然后将其传递给binaryInsertionSort函数进行排序。