目录
插入排序是一种简单直观的排序算法,它通过构建有序序列,对未排序数据逐个插入到合适的位置,从而达到排序的目的。
具体操作为:将第一个元素视为已排序部分,然后依次将后面的元素插入到已排序部分,直到所有元素都插入完成为止。
插入排序的时间复杂度为O(N^2),是一种稳定的排序算法。

采取先部分后整体的思路进行讲解

- void InsertSort(int* a, int n)
- {
- for (int i = 0; i < n-1; i++)
- {
- int end = i;
- int tmp = a[end + 1];
- while (end >= 0)
- {
-
- if (a[end] > tmp)
- {
- a[end + 1] = a[end];
- end--;
- }
- else
- {
- break;
- }
- a[end + 1] = tmp;
- }
- }
- }

插入排序的主要弊端在于其时间复杂度较高。在最坏情况下,插入排序的时间复杂度为O(n^2),因此对于大规模数据集合来说,插入排序的效率较低。尤其是当数组是升序排序时,想要转成降序排序,效率极低。
由此衍生出希尔排序。通过引入增量序列,将整个数据集合分成多个子序列,并对每个子序列进行插入排序,逐渐减小增量,最终实现对整个数据集合的排序。这样做减少了数据的搬移次数,提高了排序的效率。希尔排序通过这种分组的方式,使得较小的元素可以更快地移动到合适的位置,从而减少了插入排序中的反复比较和移动操作,提高了排序效率。
希尔排序是一种基于插入排序的排序算法,也被称为“缩小增量排序”。它的基本思想是将待排序的元素分成若干个小组,对每个小组进行插入排序;然后逐渐减小每组的元素个数,继续进行插入排序,直到每组只有一个元素为止。通过这种分组和逐渐减小增量的方式,希尔排序可以在一定程度上减少插入排序的移动操作次数,从而提高排序效率。

采取先部分后整体的思路进行讲解

- //常规思路版本
- void ShellSort(int* arr, int n)
- {
- int gap = n;
- //总排序
- while (gap > 1)
- {
- gap = gap / 3 + 1;
- //多组排序
- for (int j = 0; j < gap; j++)
- {
- //一组排序
- for (int i = j; i < n - gap; i+=gap)
- {
- int end = i;
- int tmp = arr[end + gap];
- while (end >= 0)
- {
- if (arr[end] > tmp)
- {
- arr[end + gap] = arr[end];
- end -= gap;
- }
- else
- {
- break;
- }
- arr[end + gap] = tmp;
- }
- }
- }
- }
- }
- //优化思路
- void ShellSort(int* arr, int n)
- {
- int gap = n;
- while (gap > 1)
- {
- gap = gap / 3 + 1;
- for (int i = 0; i < n - gap; i++)
- {
- int end = i;
- int tmp = arr[end + gap];
- while (end >= 0)
- {
- if (arr[end] > tmp)
- {
- arr[end + gap] = arr[end];
- end -= gap;
- }
- else
- {
- break;
- }
- arr[end + gap] = tmp;
- }
- }
- }
- }
