使用折半查找排序对此向量结构进行排序输出每一趟排序结果和最后排好序的结果。
时间: 2023-10-31 14:37:20 浏览: 33
折半查找排序(Binary Insertion Sort)是对插入排序(Insertion Sort)的一种优化。插入排序的时间复杂度为 $O(n^2)$,而折半查找排序的时间复杂度为 $O(n\log n)$,是一种稳定的排序算法。
假设有一个长度为 $n$ 的向量 $a$,折半查找排序的实现过程如下:
1. 将向量的第一个元素看作已排序的序列,第二个到最后一个元素看作未排序的序列。
2. 从未排序的序列中取出一个元素,将它插入到已排序的序列中的适当位置,使得插入后的序列仍然有序。
3. 对未排序的序列中的下一个元素重复上述步骤,直到所有元素都被插入到已排序的序列中。
以下是对向量 $a=[5, 2, 4, 6, 1, 3]$ 进行折半查找排序的过程:
第1趟排序结果:[2, 5, 4, 6, 1, 3]
第2趟排序结果:[2, 4, 5, 6, 1, 3]
第3趟排序结果:[2, 4, 5, 6, 1, 3]
第4趟排序结果:[1, 2, 4, 5, 6, 3]
第5趟排序结果:[1, 2, 3, 4, 5, 6]
最后排好序的结果为 $[1, 2, 3, 4, 5, 6]$。
相关问题
对此向量结构的元素施用直接插入排序,输出每一趟排序的结果以及最终排好序的结果;②再使用折半查找排序对此向量结构进行排序输出每一趟排序结果和最后排好序的结果。
好的,我来为您实现这两个功能。首先是使用直接插入排序对向量结构进行排序的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 自定义结构体类型
typedef struct {
int id; // 关键字字段
char name[20];
int age;
} Student;
// 直接插入排序
void straightInsertSort(Student* arr, int n) {
int i, j;
Student temp;
for (i = 1; i < n; i++) {
temp = arr[i];
for (j = i - 1; j >= 0 && arr[j].id > temp.id; j--) {
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
// 输出每一趟排序结果
printf("第%d趟排序结果:", i);
for (int k = 0; k < n; k++) {
printf("%d ", arr[k].id);
}
printf("\n");
}
}
int main() {
int n; // 数据元素个数
printf("请输入数据元素个数:");
scanf("%d", &n);
Student* arr = (Student*)malloc(n * sizeof(Student)); // 动态分配数组空间
// 输入数据元素
printf("请依次输入数据元素(id name age):\n");
for (int i = 0; i < n; i++) {
scanf("%d%s%d", &(arr[i].id), arr[i].name, &(arr[i].age));
}
// 输出原始数组元素
printf("原始数组元素如下:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i].id);
}
printf("\n");
straightInsertSort(arr, n); // 直接插入排序
// 输出最终排好序的结果
printf("排序后数组元素如下:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i].id);
}
printf("\n");
free(arr); // 释放数组空间
return 0;
}
```
以上代码实现了使用直接插入排序对向量结构进行排序,并输出每一趟排序结果和最终排好序的结果。其中,直接插入排序算法的实现在`straightInsertSort`函数中。
接下来是使用折半查找排序对向量结构进行排序的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 自定义结构体类型
typedef struct {
int id; // 关键字字段
char name[20];
int age;
} Student;
// 折半查找排序
void binaryInsertSort(Student* arr, int n) {
int i, j, low, high, mid;
Student temp;
for (i = 1; i < n; i++) {
temp = arr[i];
low = 0;
high = i - 1;
while (low <= high) {
mid = (low + high) / 2;
if (arr[mid].id > temp.id) {
high = mid - 1;
} else {
low = mid + 1;
}
}
for (j = i - 1; j >= high + 1; j--) {
arr[j + 1] = arr[j];
}
arr[high + 1] = temp;
// 输出每一趟排序结果
printf("第%d趟排序结果:", i);
for (int k = 0; k < n; k++) {
printf("%d ", arr[k].id);
}
printf("\n");
}
}
int main() {
int n; // 数据元素个数
printf("请输入数据元素个数:");
scanf("%d", &n);
Student* arr = (Student*)malloc(n * sizeof(Student)); // 动态分配数组空间
// 输入数据元素
printf("请依次输入数据元素(id name age):\n");
for (int i = 0; i < n; i++) {
scanf("%d%s%d", &(arr[i].id), arr[i].name, &(arr[i].age));
}
// 输出原始数组元素
printf("原始数组元素如下:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i].id);
}
printf("\n");
binaryInsertSort(arr, n); // 折半查找排序
// 输出最终排好序的结果
printf("排序后数组元素如下:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i].id);
}
printf("\n");
free(arr); // 释放数组空间
return 0;
}
```
以上代码实现了使用折半查找排序对向量结构进行排序,并输出每一趟排序结果和最终排好序的结果。其中,折半查找排序算法的实现在`binaryInsertSort`函数中。
先依次输入元素为整型的数个数据元素建立向量结构(数组),然后对此向量结构的元素施用直接插入排序,输出每一趟排序的结果以及最终排好序的结果;再使用折半查找排序对此向量结构进行排序输出每一趟排序结果和最后排好序的结果。用C语言实现
好的,以下是对应的C语言代码实现:
1. 直接插入排序
```c
#include <stdio.h>
void insertionSort(int arr[], int n) {
int i, j, key;
for (i = 1; i < n; i++) {
key = arr[i];
j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
// 输出每一趟排序结果
printf("第%d趟排序结果:", i);
for (int k = 0; k < n; k++) {
printf("%d ", arr[k]);
}
printf("\n");
}
}
int main() {
int arr[] = {1, 5, 3, 7, 2, 9, 4, 8, 6};
int n = sizeof(arr) / sizeof(arr[0]);
printf("排序前的数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
insertionSort(arr, n);
printf("排序后的数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
2. 折半查找排序
```c
#include <stdio.h>
void binaryInsertionSort(int arr[], int n) {
for (int i = 1; i < n; i++) {
int key = arr[i];
int left = 0, right = i - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] > key) {
// 往左边找
right = mid - 1;
} else {
// 往右边找
left = mid + 1;
}
}
for (int j = i - 1; j >= left; j--) {
arr[j + 1] = arr[j];
}
arr[left] = key;
// 输出每一趟排序结果
printf("第%d趟排序结果:", i);
for (int k = 0; k < n; k++) {
printf("%d ", arr[k]);
}
printf("\n");
}
}
int main() {
int arr[] = {1, 5, 3, 7, 2, 9, 4, 8, 6};
int n = sizeof(arr) / sizeof(arr[0]);
printf("排序前的数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
binaryInsertionSort(arr, n);
printf("排序后的数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```