插入排序,是一种简单直观的排序算法,工作原理是将一个记录插入到已经排好序的有序表中,从而形成一个新的、记录数增1的有序表。在实现过程中,它使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素和已排序序列中的元素进行比较并找到正确的位置来插入。
实际在我们平时玩的扑克牌游戏中,就用到了插入排序的思想:

当插入第i(i>=1)个元素时,前面的array[0],array[1]..array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2]..的排序码顺序进行比较,找到插入位置即将arrayl]插人原来位置上的元素顺序后移。

- void InsertSort(int* a, int n)
- {
- for (size_t i = 0; i < n - 1; i++)
- {
- int end = i;
- int tmp = a[end + 1];
- while (end >= 0)
- {
- if (tmp < a[end])
- {
- a[end + 1] = a[end];
- }
- else
- {
- break;
- }
- --end;
- }
- a[end + 1] = tmp;
- }
- }
-
- void PrintArray(int* a, int n)
- {
- for (int i = 0; i < n; i++)
- {
- printf("%d ", a[i]);
- }
- printf("\n");
- }
-
- void TestInsertSort()
- {
- int a[] = { 9,1,2,5,7,4,8,6,3,5,1,2,3,5,1,8,3 };
- InsertSort(a, sizeof(a) / sizeof(int));
- PrintArray(a, sizeof(a) / sizeof(int));
- }
-
- int main()
- {
- TestInsertSort();
- return 0;

1.元素集合越接近有序,直接插入排序算法的时间效率越高
2.时间复杂度:O(N个2)
3.空间复杂度:O(1),它是一种稳定的排序算法
4.稳定性:稳定
希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。
- void ShellSort(int* a, 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 = a[end + gap];
- while (end >= 0)
- {
- if (tmp < a[end])
- {
- a[end + gap] = a[end];
- end -= gap;
- }
- else
- {
- break;
- }
- }
- a[end + gap] = tmp;
- }
- }
- }
-
- void PrintArray(int* a, int n)
- {
- for (int i = 0; i < n; i++)
- {
- printf("%d ", a[i]);
- }
- printf("\n");
- }
-
- void TestShellSort()
- {
- int a[] = { 9,1,2,5,7,4,8,6,3,5,1,2,3,5,1,8,3 };
- ShellSort(a, sizeof(a) / sizeof(int));
- PrintArray(a, sizeof(a) / sizeof(int));
- }
-
- int main()
- {
- TestShellSort();
- return 0;
- }

1.希尔排序是对直接插入排序的优化。
2.当gap >1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比.
3.希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定
4.稳定性:不稳定
《数据结构(C语言版)》--- 严蔚敏

《数据结构-用面相对象方法与C++描述》--- 殷人昆

结语:插入排序的相关分享到这里就结束了,希望对大家的学习会有帮助,如果大家有什么问题或者不同的见解,欢迎大家的留言~~~