插入排序
来源:互联网 发布:淘宝上的众筹是真的吗 编辑:程序博客网 时间:2024/06/15 07:49
插入排序常见的两种:直接插入排序和希尔排序
直接插入排序思想 :把一个数x插入到一个有序序列a[0,…,n]中,所得到的序列依然有序
具体插入步骤(以升序为例):从有序序列a[0,…,n]的最后一个位置开始往前找,若a[i]大于x,就让a[i]后移,直到找到第一个小于x的数,将x放在该数的下一个位置。
void InsertSort(int *array, size_t size){ assert(array); int tmp = 0; for (size_t index = 1; index < size; ++index) { tmp = array[index]; int end = index - 1; while (end>=0 && array[end]>tmp) { array[end + 1] = array[end]; --end; } array[end + 1] = tmp; }}
希尔排序是直接插入排序的一种优化,也叫域排序;顾名思义,思想:将要排序的序列按某一间距值分组,每组进行插入排序,再不断缩小间距,直到间距为一,最后一次就是直接插入排序。
void ShellSort(int *array, size_t size){ assert(array); //设置gap int gap = size; while (gap > 1) { gap = gap / 3 + 1; //保证最后一次间距为1 for (size_t index = gap; index < size; index += gap)//从gap开始后面的数依次往差距为gap 的区间插 { int end = index - gap; int tmp = array[index]; while (end >= 0 && array[end]>tmp) { array[end + gap] = array[end]; end -= gap; } array[end + gap] = tmp; } } //gap等于1,直接插入排序 for (size_t index = 1; index < size; ++index) { int tmp = array[index]; int end = index - gap; while (end >= 0 && array[end]>tmp) { array[end + gap] = array[end]; end -= gap; } array[end + gap] = tmp; }}
直接插入排序时间复杂度O(n^2),空间复杂度O(1);
**直接插入排序在序列本身接近于有序时最优;
当数多、最小的几个数在最后面时,直接插入排序效率低。**
希尔排序时间复杂度O(n^1.3),空间复杂度O(1)。
希尔排序让最大的数尽快靠后,最小的数尽快靠前,保证了最后一次排序效率更高。
0 0
- 插入排序-【插入排序】
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 前端性能优化十四个规则:
- 网页元素的滑动事件(三)
- OpenJ_Bailian - 3421
- VS集成Qt环境搭建
- 用JS实现图片轮播
- 插入排序
- leetcode之Balanced Binary Tree
- java实现AVL树(一种自平衡二叉树)数据结构
- Jsp(1)jsp基础
- Spring MVC 拦截器的讲解
- iOS开发之理解iOS中的MVC设计模式
- LeetCode之9---Palindrome Number
- Linux c 目录操作函数scandir
- 从六人中选出几人参加任务