排序算法---插入排序

原创不易,转载请注明出处。欢迎点赞收藏~

插入排序是一种简单直观的排序算法,它的基本思想是将待排序的元素分为已排序和未排序两部分,每次从未排序部分中选择一个元素插入到已排序部分的合适位置,直到所有元素都插入到已排序部分,完成排序。

具体的插入排序算法如下:

  1. 从第一个元素开始,将其视为已排序部分。
  2. 取出下一个未排序元素,在已排序部分从后往前扫描,将大于该元素的元素向后移动,直到找到小于或等于该元素的位置。
  3. 将该元素插入到找到的位置。
  4. 重复步骤2和3,直到所有元素都插入到已排序部分。

插入排序的时间复杂度为O(n^2),其中n表示待排序元素的个数。最好情况下,如果待排序元素已经有序,那么插入排序的时间复杂度为O(n)。最坏情况下,如果待排序元素逆序,那么插入排序的时间复杂度为O(n^2)。 插入排序的空间复杂度为O(1),它只需要常数级别的额外空间用于存储临时变量。

值得注意的是,插入排序在处理小规模数据或者部分有序的数据时,表现优于其他复杂度更高的排序算法,因为它具有稳定性、原地排序等特点。然而,在面对大规模乱序数据时,插入排序的效率相对较低,不如快速排序、归并排序等高效排序算法。

以下是一个用C语言编写的插入排序的示例代码:

#include 

// 插入排序函数
void insertion_sort(int arr[], int n)
{
    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--;
        }

        arr[j + 1] = key;
    }
}

int main()
{
    int arr[] = {5, 2, 8, 12, 3};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("排序前的数组:\n");
    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }

    insertion_sort(arr, n);

    printf("\n排序后的数组: \n");
    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    putchar('\n');

    return 0;
}

在这个示例中,我们定义了一个insertion_sort函数来实现插入排序算法。该函数以一个整型数组和数组长度作为参数,并对数组进行原地排序。

main函数中,我们创建了一个示例数组arr,然后调用insertion_sort函数对数组进行排序。最后,我们使用printf函数输出排序后的结果。

运行这段代码,你可以看到以下输出:

你可能感兴趣的:(排序算法,排序算法,算法,数据结构)