zoukankan      html  css  js  c++  java
  • 插入排序算法(直接,折半,希尔)

    插入排序

     

    直接插入排序的算法思想是:

     以数组的第一个元素作为基础,从第二个元素开始下标index = 1,依次到N。

     然后顺序的从下标0到下标index-1,与当前待插入的元素下标index进行比较,查找到合适的插入位置,然后将当前元素放到此位置上。
    两个循环:一是 从第二个元素开始,依次到N

          二是 比较寻找合适位置,移动数组,插入元素 

    两个过程:一是查找插入位置

           二是将相应元素放到插入的位置上

    时间复杂度为:O(n^2)

    其实现算法如下:

    一 按照过程进行:

    bool sort_by_insert(int *src,int len)
    {
    int index = 1;
    int i,j,temp;
    while(index < len)
    {
    temp = src[index];

    //寻找插入位置
    for(i = 0; i < index ; i++)

    {
    if(src[i] > temp)
    {
    break;
    }
    }

    //移动数组记录
    for (j = index; j > i ; j--)

    {
    src[j] = src[j-1];
    }
    src[i] = temp;

    index++;
    }

    return true;
    }

    二 合并两个过程

    bool sort_by_insert_ex(int *src,int len)
    {
    int index = 1;
    int i,temp;
    while(index < len)
    {
    temp = src[index];
    for(i = index; i>0; i--)
    {
    if(src[i-1] > temp)
    {
    src[i] = src[i-1];
    }
    else
    {
    break;
    }
    }
    src[i] = temp;
    index++;
    }

    return true;
    }
    三 插入排序改进
      插入排序算法主要 是两个过程:比较移动。想要提高速率,只能从这两方面上改进。
    1 折半掺入排序(减少比较次数)
    bool sort_by_half_insert(int *src,int len)
    {
    int index = 1;
    int i,j,temp;
    while(index < len)
    {
    temp = src[index];

    //寻找插入位置
    i = 0;

    j = index;
    while(i < j)
    {
    //折半进行比较
    if(temp <= src[(i + j)/2])

    {
    j = (i + j)/2 - 1;
    }
    else
    {
    i = (i + j)/2 + 1;
    }
    }

    //移动数组记录
    for (j = index; j > i ; j--)

    {
    src[j] = src[j-1];
    }
    src[i] = temp;

    index++;
    }

    return true;
    }
     
    四 希尔排序
    基本思想:将待排序列,按照等间隔分成几个组,然后分别对每个组进行插入排序。
    
    
    bool sort_by_shell(int *src,int len)
    {
    int start = 1;
    int i,step,Temp;

    //获取增量序列的最大值 以 h = 3*h + 1 方式
      for(step = 0; step <= len/9; step = step*3 + 1)
    ;
    for(step ;step > 0; step /= 3)
    {
    //一趟希尔排序
    for(start = step; start < len; start++)
    {
    Temp = src[start];
    //分组排序
    for(i = start - step; i>=0; i-= step)
    {
    if (src[i] > Temp)
    {
    src[i + step] = src[i];
    }
    else
    {
    break;
    }

    src[i] = Temp;
    }
    }
    }

    return 0;
    }





  • 相关阅读:
    C#中double转int时需要注意的地方
    OracleHelper类
    POJ2570, ZOJ1967
    ZOJ3088
    POJ3259(spfa判负环)
    POJ3268
    ZOJ1092 POJ2240
    ZOJ1298 POJ1135
    SRM587 div2
    POJ1679判断最小生成树是否唯一
  • 原文地址:https://www.cnblogs.com/bastard/p/2251974.html
Copyright © 2011-2022 走看看