c - 希尔排序的时间复杂度

标签 c sorting shellsort

为什么希尔排序的时间复杂度比冒泡排序和插入排序要低?我们如何计算时间复杂度,我的意思是我们在什么基础上认为我们的代码时间复杂度高或低?

#include <stdio.h>
void shellsort(int arr[], int num)
{
    int i, j, k, tmp;
    for (i = num / 2; i > 0; i = i / 2)
    {
        for (j = i; j < num; j++)
        {
            for (k = j - i; k >= 0; k = k - i)
            {
                if (arr[k + i] >= arr[k])
                    break;
                else
                {
                    tmp = arr[k];
                    arr[k] = arr[k + i];
                    arr[k + i] = tmp;
                }
            }
        }
    }
}
int main()
{
    int arr[30];
    int k, num;
    printf("Enter total no. of elements : ");
    scanf("%d", &num);
    printf("\nEnter %d numbers: ", num);
    for (k = 0; k < num; k++)
    {
        scanf("%d", &arr[k]);
    }
    shellsort(arr, num);
    printf("\n Sorted array is: ");
    for (k = 0; k < num; k++)
        printf("%d ", arr[k]);
    return 0;
}

最佳答案

关于你的问题我们在什么基础上认为我们的代码时间复杂度高或低对于具有 N 个元素的排序算法,需要考虑的一个简单的事情是进行多少次比较来对元素数组进行排序。比较进一步导致元素交换,这意味着系统 (CPU) 上使用了更多资源。

冒泡/插入排序最终可能会进行 n^2 次比较(如果不进行交换,则可以进行优化,然后不再扫描已排序的数组)。希尔排序经过改进,在某些情况下比 n^2 表现更好。维基百科指针是一个很好的引用,但建议阅读一本专门处理排序的算法书籍,以获得更清晰的信息(数据结构和算法分析 - Mark Allen Weiss 或其他人)

关于c - 希尔排序的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42283572/

相关文章:

java - 使用嵌套对象执行 Collections.sort() 时如何处理空值?

c - Shell 排序中的 h 排序

sorting - 为什么反转的分布在插入排序中不重要?

c - 为什么静态变量在每次调用函数时都会初始化,但在 C 中每次都必须声明它

C:(工作但未按预期进行)我的确定方法是编辑提供的矩阵(作为参数)但我只是希望它提供确定的

python - 多维 ndarray 的 argsort

asp.net - 从 excel ASP.Net 获取工作表名称

c++ - c中的外部关键字

java - 按字母顺序对对象进行排序