首页 > 编程知识 正文

直接选择排序算法,数组排序算法

时间:2023-05-03 19:56:50 阅读:141632 作者:2191

直接插入排序1基本原理1 核心思想:插入排序通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入 ,如此重复,直至完成序列排序。

2 算法分析

1 .从序列的第一个元素开始,我们认为该元素已经排序

2 .取出下一个元素,将其设置为要插入的元素,在排序的元素序列中从后到前扫描,如果该元素大于要插入的元素,则将其移动到下一个位置。

3 .重复步骤2,直到已排序的元素小于或等于要排序的元素

4 .重复步骤2和3以完成排序。

2实例说明

如上图所示,以一组数据{12、15、9、20、6、31、24}为例,演示了直接插入和排序缺省序列中第一个元素12和已排序数据的算法。 以下元素15与从后到前排序的序列进行一次比较,15插入12后,排序的序列为[ 12,15 ]。 去掉一个元素9,重复这两个步骤,在将9插入12之前,被排序的序列是[ 9,12,15 ]。 重复上述操作直到最后一个元素24,将其插入适当的位置并完成排序。 3代码实现//直接插入排序(c ) voidinsertsort ) vectorintVI ) { for } inti=1; ivi.size (; I ) { int temp=vi[i]; int j; for(j=I-1; j=0tempvi[j]; j--}{VI[j1]=VI[j]; //使大元素向后移动(} vi[j 1]=temp; //temp插入正确位置}} 算法改进:二分插入排序

二分查找插入排序原理:是直接插入排序的变种。 不同的是,在有序区域中寻找新元素的插入位置时,为了减少元素的比较次数,提高效率,采用二分搜索算法进行插入位置的确定。

算法分析:

设排列为a[0…n]。

1 .将原序列分为有序区和无序区。 a[0…i-1]是有序区域,a[i…n]是无序区域。 (I从1开始)

2 .从无序区域中取出第一个要素a[i],用二分搜索算法搜索有序区域内要插入的位置索引j。

3 .将a[j]移至a[i-1]的要素,并将a[i]分配给a[j]。

4 .重复步骤2~3,直到无序区元素为0。

//二分插入排序voidbininsertsort(vectorintVI ) for ) intI=1; ivi.size (; I ) { int left=0; int right=i-1; inttemp=VI[I]while(left=right ) ) intmid=) leftright )/2; //二分区域if(VI[mid]temp ) { right=mid-1; //向左缩小区域(else ) left=mid1; //向右缩小区域}}for(intj=I-1; jleft; j--//VI[left,i-1]的元素整体向后移动{ vi[j 1]=vi[j]; ) } vi[left]=temp; }4性能分析1 时间复杂度

)按顺序排列时,仅与(n-1 )次比较,排序时间复杂度为O(n)

)2)反向排序时,比较n(n-1 )/2次,插入排序时间复杂度为O(n^2)

)3)原排列杂乱无序时,按http://www.Sina.com/2 http://www.Sina.com /

插入排序时,需要临时变量temp来存储要排序的元素,因此请单击http://www.Sina.com/3 http://www.Sina.com /

插入排序为平均时间复杂度为O(n^2)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。