最差时间复杂度 n*(n-1)/2,挺快的void cal(int num[],int n){ int i,j; for(i=1;i<n;i++) { int key=num[i]; j=i-1; while(j>=0&&num[j]>key) { num[j+1]=num[j--]; } num[j+1]=key; }}原文:http://www.cnblogs.com/jihe/p/4836956.html
继上篇讲了冒泡排序的原理和代码,今天来讲一讲关于插入算法的逻辑。和冒泡排序不同,排序算法,是选择一个元素依次和位于前面的元素进行比较。比如我选择的是第i个元素,则要判断第i-1个元素的大小。 插入排序也分成两套循环,外套循环比如是指针,来选择从第几个元素开始比较,而内套循环则要开始比较选择元素和前面元素的大小,进行排序。代码如下:package cn.tgb.sort;import java.util.Arrays;//插入排序 public clas...
插入排序的思想就和玩扑克是的摸牌一样,摸到一张牌放手上,再摸一张和之前的比较,大的就放后面,小的就放前面。一个数列我们把它分为两个区,一个是已经排序的区,一个是乱序区,选取第一个元素出来作为排序区的元素,然后从第二个元素开始往后作为乱序区,从第二个元素开始(并把这个元素复制出来叫做下标元素),分别和排序区的元素比较大小,如果这个元素比排序区的元素小,则把排序区的元素依次往后一位,然后把下标元素复制进...
插入排序是一种稳定性排序!什么叫稳定性:相同的元素在排序后没有发生位置的变化我们称这种算法为稳定排序(这个性质针对多属性排序是由意义的)插入排序算法有两种方式# 方法1 # 思路:分为两个序列,有序序列[arr0],无序序列arr[1:] # 然后不断的和有序对比,当小于有序序列的最后个数时,就交换位置,以此类推完成排序def insert_sort(arr):for i in range(1, len(arr)):for j in range(i, 0, -1):if arr[j] < arr[j-1]:arr[j...
插入排序的主要思想是每次取一个列表元素与列表中已经排序好的列表段进行比较,然后插入从而得到新的排序好的列表段,最终获得排序好的列表。比如,待排序列表为[49,38,65,97,76,13,27,49],则比较的步骤和得到的新列表如下:(带有背景颜色的列表段是已经排序好的,红色背景标记的是执行插入并且进行过交换的元素)时间复杂度:O(n^2)待排序: [49,38,65,97,76,13,27,49]第一次比较后: [38,49,65,97,76,13,27,49] 第...
定义数组长度变量$len,使用count()函数,参数:数组for循环数组,条件:从第二个开始,遍历数组,循环内 定义临时变量$temp,赋值当前元素 for循环数组,条件:遍历当前元素前面的所有元素 判断当前元素与它前面的元素的大小,利用临时变量,转换变量PHP版:<?php $arr=array(2,3,4,1,5); function insert_sort($arr){$len=count($arr);for($i=1;$i<$len;$i++){$temp=$arr[$i];for($j=$i-1;$j>=0;$j--){i...
许久没有写点东西了,答辩之后人也变得松懈。今天看到简书又有人点赞之前记录的冒泡排序,点进去一看,居然有4w+的阅读量,心生疑问,咋会有这么高的阅读量,打开百度搜索冒泡排序,结果第3条就是我的。点开认真看了看,其实写得不好,还改了两个错别字(狗头),这个阅读量或许只是记录的点击量。但我萌生一个想法,趁现在有时间,想把排序系列做完,便于以后自己回顾。排序系列传递门排序—冒泡排序排序—选择排序排序—快速排序 排...
直接插入排序 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的序列中,知道全部记录插入完成。 排序过程 1.每次插入的数值都要与自己前面的做比较 A.如果大于前面的数,则停止。因为每次都是排好的序列 B.如果小于前面的数,接着向前比较,指导找到自己的位置,插入即可 如右图所示 当插入2时,需要与前面做比较,直到找到自己合适的位置即可 当插入1时,用现在插入的数值依次与前面做比较,直到找到合适的位置...
1 #include"iostream" 2#define N 103usingnamespace std;4void excha(int &a,int &b);5int main(){6int a[N]={1,3,2,4,5,6,7,8,9,0};7int i,j,min;8for(int i=1;i<N;i++){91011for(int j=i;j>0&&(a[j]<a[j-1]);j--){ 12 excha(a[j],a[j-1]); 13 } 14 } 15for(int i=0;i<N;i++){ 16 cout<<a[i]<<""; 17 } 18return0; 19} 20void excha(int &a,int &b){ 21int c; 22 c=a; 23 a=b; 24 ...
在冒泡排序、选择排序编写代码之后,楼主渐渐找到了coding的信心,熟能生巧,就像写词唱曲之前,都得先背诵大量的诗词,熟悉各路歌曲,才干走出自己的路线,有自己的杰作。好吧,来让楼主继续进行"社会主义0基础阶段"的任务,这次是插入排序。一. 算法描写叙述 插入排序:插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序。比如有一个长度为N的无序数组,进行N-1次的插入即能完毕排序;第一次,数组第1个数觉得是...
概念:将一个数据插入已经排好序的有序数组中,从而得到一个新的多一个数据的有序数组。概念理解~~将要排序的是一个乱的数组int[] arrays = {3, 2, 1, 3, 3}; 在未知道数组元素的情况下,我们只能把数组的第一个元素作为已经排好序的有序数据,也就是说,把{3}看成是已经排好序的有序数据第一趟排序: 用数组的第二个数与第一个数(看成是已有序的数组)比较如果比第一个数大就不用管如果比第一个数小,将第一个数往后退一步,将第二...
这篇小日志,简单哦整理了下直接插入排序,参考过 八大排序算法和度娘的直接插入排序。其中八大排序算法整理的比较好,这里Copy部分讲解作为自己记录。将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。源码方面开始参考的两篇文章,但在尽量精简代码上发现还可以在原有代码上进行优化,自己整理的代码如下: // 时间复杂性为 O(n^2)// 空间复杂度为 O(1)// 直接插入排序:将一个记录插入到已排序好的有...
选择排序,冒泡排序,快速排序,归并排序,插入排序,希尔排序,计数排序,桶排序,基数排序 以上是一些常用的排序算法。选择排序 for(int i = 0; i < n; i++) { int minval = a[i]; int minid = i; for (int j = i+1; j < n; j++) { if (a[j] < minval) { minid = j; minval = a[j]; } } swap(a[i], a[minid]); } 最简单的就是选择排序,就是每次遍历数组,然后依次得到第一小的,第二小的,知道整个数组递增有序。所以时间复杂度...
function insertSort($arr) { $len=count($arr); for($i = 1 ;$i<$len;$i++) { $temp = $arr[$i];// $tmp = 3; 2 for($j = $i - 1;$j >=0; $j-- ) { //1 0 3 88 2 5 4 3 66 0 if($temp < $arr[$j]){ // 3 < 88 2<88 $arr[$j+1] = $arr[$j]; //把当前的值放到后面一个上面, $arr[$j] = $temp; //把插入的值插入给当前位置 } } echo "...
插入排序 Insert Sort● 插入排序的思想:将一个待排序的无序的数组看作是两个列表,一个有序的列表,一个无序的列表,从无序的列表每次拿出一个待插入的元素,插入到有序的列表中,直到无序列表为空,排序完毕● 实际举例:1. 有一个无序的一维数组是这次需要排序的数组,数组是:[36,12,96,-1]2. 首先把数组的第一个元素 [36] 看作是一个独立的有序的列表,把剩下的元素 [12, 96, -1] 看作是一个无序的列表3. 第一个待插入的元素...