开发者社区> 问答> 正文

c语言中数组排序里的插空排序法是什么意思啊?

c语言中数组排序里的插空排序法是什么意思啊?

展开
收起
知与谁同 2018-07-18 19:20:21 2355 0
2 条回答
写回答
取消 提交回答
  • Nothing for nothing.
    它所做的过程是先移动较大的数据,然后再把移动后空出来的那个插入点 插入这个数
    因此不需要临时变量。
    因为最开始声明时候那数组肯定要比初始化的数目大,至少大1个,以便来存这个要插入的数
    所以这个数组最后就空出来一个位置,这样,依次把前面大的数向后移动一位,注意这个移动是从后面开始的
    比如我int a[11]; 总共初始化有10个已排好序的值,并有一个空位,我移动时,先把a[9]赋给
    a[10],即 a[10] = a[9]; 这样原来最后的一个数就真的变成数组中最后一个位置的数了
    依次下去a[9] = a[8]; 把8号位赋给9号位。。。。这样直到你那个插入点
    把插入点空出来了,就可以把那个值插进去了。
    2019-07-17 22:50:21
    赞同 展开评论 打赏
  • 插入排序法是一种数组元素排序方法,冒泡法也是。
    两者是不同的排序,两者时间复杂度为n的平方,而冒泡法更直观一点。

    插入排序就相当于打牌,假如你手里的牌是从小到大排好序的,那么你每摸一张牌,你就会根据这张牌的大小寻找这张牌应该插入的位置,然后插进去。
    选择排序就是你一下获得了所有的牌,这些牌是无序的,这时,你选择一个最大的牌放在前面,然后再从后面的牌选择最大的放在第2的位置,依此类推。

    插入排序是这样实现的:
    首先新建一个空列表,用于保存已排序的有序数列(我们称之为"有序列表")。
    从原数列中取出一个数,将其插入"有序列表"中,使其仍旧保持有序状态。
    重复2号步骤,直至原数列为空。
    插入排序的平均时间复杂度为平方级的,效率不高,但是容易实现。它借助了"逐步扩大成果"的思想,使有序列表的长度逐渐增加,直至其长度等于原列表的长度。
    void InsertSort(int* pData,int Count)
    {
    int iTemp;
    int iPos;
    for(int i=1;i<Count;i++)
    {
    iTemp = pData[i]; //保存要插入的数
    iPos = i-1; //被插入的数组数字个数
    while((iPos>=0) && (iTemp<pData[iPos]))
    { //从最后一个(最大数字)开始对比,大于它的数字往后移位
    pData[iPos+1] = pData[iPos];
    iPos--;
    }
    pData[iPos+1] = iTemp; //插入数字的位置
    }
    }
    2019-07-17 22:50:21
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载