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 &lt; 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 &lt; 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(&amp;file, 'process and results.txt', 'w');
if (file == NULL) {
    printf('无法打开文件\n');
    return 0;
}

fprintf(file, '原始数组: ');
for (int i = 0; i &lt; 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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录