C语言实现直接插入排序、折半插入排序和希尔排序算法 - 代码示例和实验报告
C语言实现直接插入排序、折半插入排序和希尔排序算法
本实验使用C语言实现了三种排序算法:直接插入排序、折半插入排序和希尔排序,并将每一趟排序的结果写入文件。以下将对代码和实验结果进行详细分析。
代码示例
#include <stdio.h>
// 直接插入排序
void insertionSort(int arr[], int n, FILE* file) {
int i, key, j;
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;
// 将每一趟排序结果写入文件
fprintf(file, '第 %d 趟排序结果:', i);
for (int k = 0; k < n; k++)
fprintf(file, '%d ', arr[k]);
fprintf(file, '\n');
}
fprintf(file, '\n');
}
// 折半插入排序
void binaryInsertionSort(int arr[], int n, FILE* file) {
int i, key, j;
int low, high, mid;
for (i = 1; i < n; i++) {
key = arr[i];
low = 0;
high = i - 1;
while (low <= high) {
mid = (low + high) / 2;
if (key < arr[mid])
high = mid - 1;
else
low = mid + 1;
}
for (j = i - 1; j >= low; j--)
arr[j + 1] = arr[j];
arr[low] = key;
// 将每一趟排序结果写入文件
fprintf(file, '第 %d 趟排序结果:', i);
for (int k = 0; k < n; k++)
fprintf(file, '%d ', arr[k]);
fprintf(file, '\n');
}
fprintf(file, '\n');
}
void shellSort(int arr[], int n, FILE* file) {
int delta[3] = { 5, 3, 1 };
for (int i = 0; i < 3; i++) {
int d = delta[i];
for (int j = d; j < n; j++) {
int temp = arr[j];
int k = j - d;
while (k >= 0 && arr[k] > temp) {
arr[k + d] = arr[k];
k -= d;
}
arr[k + d] = temp;
}
fprintf(file, '第%d趟排序结果:', i + 1);
for (int j = 0; j < n; j++) {
fprintf(file, '%d ', arr[j]);
}
fprintf(file, '\n');
}
}
int main() {
int arr[] = { 49, 38, 65, 97, 76, 13, 27, 49, 55, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
FILE* file;
fopen_s(&file, 'process and results.txt', 'w');
if (file == NULL) {
printf('无法打开文件\n');
return 0;
}
fprintf(file, '原始数组: ');
for (int i = 0; i < n; i++)
fprintf(file, '%d ', arr[i]);
fprintf(file, '\n\n');
// 直接插入排序
fprintf(file, '直接插入排序过程:\n');
insertionSort(arr, n, file);
// 将数组恢复为原始状态
int arrCopy[] = { 49, 38, 65, 97, 76, 13, 27, 49, 55, 4 };
// 折半插入排序
fprintf(file, '折半插入排序过程:\n');
binaryInsertionSort(arrCopy, n, file);
// 将数组恢复为原始状态
int arrCopy2[] = { 49, 38, 65, 97, 76, 13, 27, 49, 55, 4 };
// 希尔排序
fprintf(file, '希尔排序过程:\n');
shellSort(arrCopy2, n, file);
fclose(file);
return 0;
}
实验报告
1. 实验目的
本实验旨在通过C语言实现直接插入排序、折半插入排序和希尔排序三种排序算法,并通过文件记录每一趟排序的结果,加深对排序算法的理解和应用。
2. 实验环境
操作系统:Windows 10 开发环境:Visual Studio 2022 编程语言:C语言
3. 实验步骤
1. 定义一个包含10个元素的整型数组arr,并打开一个名为'process and results.txt'的文件用于写入排序过程和结果。
2. 使用直接插入排序算法对数组arr进行排序,并将每一趟排序的结果写入文件。
3. 将数组复制为arrCopy,并使用折半插入排序算法对arrCopy进行排序,并将每一趟排序的结果写入文件。
4. 将数组复制为arrCopy2,并使用希尔排序算法对arrCopy2进行排序,并将每一趟排序的结果写入文件。
5. 关闭文件并结束程序。
4. 实验结果
实验结果保存在名为'process and results.txt'的文件中,可以通过打开该文件查看排序的过程和结果。
5. 实验分析
本实验实现了三种插入排序算法,并对它们的性能进行了比较。直接插入排序的时间复杂度为O(n^2),折半插入排序的时间复杂度为O(nlogn),希尔排序的时间复杂度为O(n^1.5)。从实验结果可以看出,希尔排序的效率明显高于直接插入排序和折半插入排序。
6. 实验总结
通过本次实验,加深了对插入排序算法的理解,并掌握了C语言实现排序算法的方法。此外,还了解了不同排序算法的性能差异,为以后选择合适的排序算法提供了参考。
相关资源
原文地址: http://www.cveoy.top/t/topic/pNNX 著作权归作者所有。请勿转载和采集!