插入类的排序算法

#include<stdio.h>
/*
* 插入排序算法 每天一道算法题
*/
void traverseArray(int *p,int length)
{
   int i=0;
   for(;i<length;i++)
   {
     printf("%d\n",p[i]);
   } 

}
//直接插入排序
void insertSorted(int *p,int length)
{
   int i,j,temp;
   for(i=1;i<length;i++)
   {
     if(p[i]<p[i-1])
     {
       temp=p[i];
       p[i]=p[i-1];
       for(j=i-2;j>-1&&temp<p[j];j--)
          p[j+1]=p[j];
       p[j+1]=temp;

     }
   }
}
//折半插入排序
void BinsertSort(int *p,int length)
{
  int i,j,temp,low,high,m;
  for(i=1;i<length;i++)
  {
    low=0;
    high=i-1;
    temp=p[i];
    while(low<=high)
    {
       m=(low+high)/2;
      if(p[m]>temp)
          high=m-1;
      else
          low=m+1;
    }
    for(j=i-1;j>=high+1;j--)
      p[j+1]=p[j];
    p[j+1]=temp;
  }
}
//希尔排序
void ShellSort(int *p,int length,int dk)
{
  int i,j,temp;
  for(i=dk;i<length;i++)
  {
    if(p[i-dk]>p[i])
    {
      temp=p[i];
      for(j=i-dk;j>-1&&p[j]>temp;j-=dk)
         p[j+dk]=p[j];
      p[j+dk]=temp;
    }
  }
}
int main()
{
  int a[]={3,2,1,4,5,7,9,8,6};
 // insertSorted(a,sizeof(a)/sizeof(int));
 // BinsertSort(a,sizeof(a)/sizeof(int));
  int i=4;
   for(;i>0;i--)
   {
    ShellSort(a,sizeof(a)/sizeof(int),i);
    traverseArray(a,sizeof(a)/sizeof(int));
    printf("\n");
   }
  traverseArray(a,sizeof(a)/sizeof(int));
  system("pause");
}

 直接插入排序算法逆序比较的次数(n-2)(n+1)/2,需要移动的次数为(n+4)(n-1)/2,如果是正序的话,需要比较的次数为n-1,此时不需要移动,平均算法比较和移动的次数为n2/4,算法的时间复杂度为O(n2)。

折半插入排序算法移动的次数和直接插入排序是相同的,比较的次数比直接插入排序减少,因此算法的时间复杂度为O(n2)。

希尔排序的思想每次先把组内的顺序排好,然后再修改组的大小,直到为1为止。希尔排序最好的的时间复杂度为n1.3。

插入类排序思想编程在于,每一次进行排序时,前面已经排序有序的,因此只要从后面往前面依次比较即可,需要注意内层循环的边界值,应该可以取到0值,否则第一个值就无法与后面的值进行比较。

插入类排序适用于基本有序的序列,其为稳定类排序。

时间: 2024-09-28 19:00:18

插入类的排序算法的相关文章

Enum&lt;E extends Enum&lt;E&gt;&gt;类和排序算法

1 Enum<E extends Enum<E>>类 这是所有 Java 语言枚举类型的公共基本类. 2 常见排序算法 冒泡法.简单.比较小的需求可以采用此方法. 快速排序.确定关键字,将数据分为小于和大于关键字两部分.然后递归快排这两部分. 插入排序.将数据分为有序和无序两部分,逐一遍历无序部分,将记录逐条插入有序部分.有改进的折半插入排序,即插入的时候采用二分查找确认插入位置. 希尔排序.将数据间隔分组,组内进行插入排序.间隔逐次递减,直至为1. 选择排序.将数据分为有序和无序

选择、冒泡、插入、直接排序算法

1 public class Demo { 2 3 public static void main(String[] args) { 4 int[] arr = new int[10]; 5 for (int i = 0; i < arr.length; i++) { 6 Random rd = new Random(); 7 arr[i] = rd.nextInt(100); 8 } 9 System.out.println("需排序数组-->"); 10 for (in

常用排序算法的python实现和性能分析

http://www.cnblogs.com/wiki-royzhang/p/3614694.html 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试题整了一下,可以阶段性的留下些脚印——没办法,平时太忙,基本上没有时间写博客.面试测试开发的话,这些也许能帮得上一些. 这篇是关于排序的,把常见的排序算法和面试中经常提到的一些问题整理了一下.这里面大概有3个需要提到的问题: 虽然专业是数

八大排序算法之七-归并排序

归并类的排序算法 归并:将两个或两个以上的有序表组合成一个新的有序表. 内部排序中,通常采用的是 2-路归并排序.即:将两个位置相邻的记录有序子序列归并为一个记录有序的序列.归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 图解如下 看成是 n 个有序的子序列(长度为 1),然后两两归并. 得到 n/2 个长度为2 或 1 的有序子序列.继续亮亮归并 最后一趟 代码如下: #include<iostream> #i

排序算法四:交换排序之冒泡排序

排序算法四:交换排序之冒泡排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评>中给出的首个算法就是高效的排序算法.本文将对排序算法做一个全面的梳理,从最简单的"冒泡"到高效的堆排序等. 系列博文的前三篇讲述了插入排序的三种不同类型,本文讲述第二大类的排序算法:交换排序,包括冒泡排序和快速排序. 排序相关的的基本概念 排序:将一组杂乱无章的数据按一定的规律顺次排列起

详谈排序算法之插入类排序(两种思路实现希尔排序)

1. 排序( sorting) 的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.其确切的定义为: 假设有n个数据元素的序列{R1 , R2 , - , Rn},其相应关键字的序列是{K1 , K2 , - , Kn} ,通过排序要求找出下标 1 , 2 , - , n的一种排列p1 , p2 , - , pn,使得相应关键字满足如下的非递减(或非递增)关系Kp1 ≤ Kp2 ≤ - ≤ Kpn这样,就得到一个按关键字有序的纪录序列{ Rp1 , Rp2 , - , Rpn }

经典排序算法的PHP实现类

近期广受笔试摧残,对于各种排序也是晕头转向. 更坑爹的是貌似大多都是用C++.Java实现相关算法,让我搞PHP的情何以堪,更何况,PHP本身就有排序函数sort(),其实来说,是很简单的,这也可能是为什么不用PHP进行排序吧. 但考虑到PHP毕竟也是一门面向对象的语言吧,我们利用原生的语法,也是可以实现经典排序算法的,先不说性能如何,切不要妄自菲薄吧. 下面为具体的经典排序算法的PHP实现类. <?php /** * Author: helen * CreateTime: 2016/4/15

详谈排序算法之选择类排序(两种方法实现堆排序)

   今天我们再来讨论一下选择类排序,选择类排序分为:简单排序,树形选择排序和堆排序.但我们主要说的是简单和堆排序两个,因为树形选择排序使用了较多的辅助空间,以及和∞进行多余比较,为弥补树型选择排序的这些缺点, J.W.J.Williams 在 1964 年提出了进一步的改进方法,即堆排序.对于我个人而言..一开始并不是很理解它的算法思想,纠结了许久.在网上查找资料的时候发现这位大神的文章思路十分清晰,而且把创建堆以及堆化数组的算法讲解的十分详细.如果有不明白堆排序思路的,可以先看看这篇文章~堆

排序算法总结----比较类排序

概述:排序算法可分为比较性的排序,以及运算性的排序:这里详细介绍这些排序的原理,性能,实现,以及应用场合. 前面是维基百科的介绍,这里介绍几个比较典型的算法. 理论 计算复杂性理论 大O符号 全序关系 列表 稳定性 比较排序 自适应排序 排序网络 整数排序 交换排序 冒泡排序 鸡尾酒排序 奇偶排序 梳排序 侏儒排序 快速排序 臭皮匠排序 Bogo排序 选择排序 选择排序 堆排序 Smooth排序 笛卡尔树排序 锦标赛排序 循环排序 插入排序 插入排序 希尔排序 二叉查找树排序 图书馆排序 Pat