📅  最后修改于: 2023-12-03 14:49:02.137000             🧑  作者: Mango
二进制插入排序是一种排序算法,它通过将待排序的数字转换为二进制形式,然后插入到已排序数组中正确的位置。此算法比插入排序算法更快。在这篇文章中,我们将学习如何实现二进制插入排序的C程序。
#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函数进行排序。