当前位置:   article > 正文

C语言经典算法之希尔排序算法_希尔排序 c语言代码

希尔排序 c语言代码

目录

前言

一、代码实现

二、算法的时空复杂度

时间复杂度:

空间复杂度:


前言

建议:1.学习算法最重要的是理解算法的每一步,而不是记住算法。

           2.建议读者学习算法的时候,自己手动一步一步地运行算法。

tips:本算法是在直接排序算法的基础上拓展而来的,读者先将直接排序算法的逻辑理清之后更容易理解本算法。当然,也可以直接学习本算法。

希尔排序(Shell Sort)是一种插入排序的改进版本,其核心思想是通过逐步缩小数组的间隔,对子序列进行插入排序,最终实现对整个数组的排序。

一、代码实现

 
  1. #include <stdio.h>
  2. // 希尔排序函数
  3. void shellSort(int arr[], int n) {
  4. // 初始间隔设定为数组长度的一半
  5. for (int gap = n / 2; gap > 0; gap /= 2) {
  6. // 对每个子序列进行插入排序
  7. for (int i = gap; i < n; i++) {
  8. int temp = arr[i];
  9. int j;
  10. // 对子序列进行插入排序
  11. for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
  12. arr[j] = arr[j - gap];
  13. }
  14. // 插入当前元素到正确位置
  15. arr[j] = temp;
  16. }
  17. }
  18. }
  19. // 打印数组元素
  20. void printArray(int arr[], int size) {
  21. for (int i = 0; i < size; i++) {
  22. printf("%d ", arr[i]);
  23. }
  24. printf("\n");
  25. }
  26. int main() {
  27. int arr[] = {12, 34, 54, 2, 3};
  28. int n = sizeof(arr) / sizeof(arr[0]);
  29. printf("原始数组: \n");
  30. printArray(arr, n);
  31. // 调用希尔排序算法
  32. shellSort(arr, n);
  33. printf("\n排序后的数组: \n");
  34. printArray(arr, n);
  35. return 0;
  36. }

这段C代码中,shellSort函数实现了希尔排序算法,首先以一定的间隔(这里使用数组长度的一半)对数组进行分组,然后对每个子序列进行插入排序。随着排序的进行,不断缩小间隔,最终完成整个数组的排序。

main 函数中,我们创建一个简单的整数数组并调用 shellSort 函数进行排序,最后打印排序后的数组。希尔排序的优点在于相对于普通的插入排序,它在初始阶段就能够对数组的大部分乱序情况进行较快的修复,从而提高整体性能。

二、算法的时空复杂度

时间复杂度:

希尔排序(Shell Sort)是一种插入排序的改进版本,它通过逐步缩小子序列的间隔,对子序列进行插入排序,最终实现对整个数组的排序。希尔排序的时间复杂度与选取的间隔序列密切相关。

希尔排序的最坏时间复杂度取决于选用的间隔序列。一般而言,希尔排序的最坏时间复杂度为 O(n^2),这是由于在某些间隔下,对于逆序对的情况,插入排序需要多次移动元素,导致时间复杂度增加。

希尔排序的平均时间复杂度相对较难确定,因为它取决于选用的间隔序列。在平均情况下,希尔排序的时间复杂度可以达到 O(nlog 2 n)O(n^{4/3}),这比普通的插入排序 O(n^ 2 ) 要好很多。

希尔排序的优劣取决于选用的间隔序列,而不同的间隔序列可能导致不同的性能。目前还没有找到一种通用的最优间隔序列,因此在实践中,人们常常根据经验或问题特点来选择适合的间隔序列。希尔排序在某些特定场景下仍然是一个有效的排序算法,特别是对于中小规模数据。

空间复杂度:

希尔排序的空间复杂度是 O(1),即常数级别的额外空间。

tips:对于考研的小伙伴而言,希尔排序的时间复杂度一般不是重点内容

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号