排序算法之直接插入排序

来源:互联网 发布:云计算服务级别sla 编辑:程序博客网 时间:2024/06/05 11:58

  最近准备面试,发现算法都快忘光了,抽空整理学习一下。

  这一篇是关于直接插入排序的。

  概念:将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录+1的有序表。也即:先将序列的第一个记录看成是一个有序的子序列,然后从第二个记录开始,逐个地将后面的记录进行插入,直至整个序列都按照我们想要的样子进行了排序。

  简单来说,对于整数数组,采取升序的方法,就是从第一个位置的数开始,首先去判断第二个位置的数是不是比它小,如果小,就表示它们需要交换位置,即要进行插入。前两个数字排好序后,进行第二次的循环,查看第三个数和前面两个数的大小关系,进行排序,得到一个长度为3的新的排好序的数组.....以此,逐个地将所有的数都进行了排序。

  下面是关于整数数组排序的示例代码,分别为升序和降序,理解有困难的可以参照注释。

 

 //my own 插入排序,此处,采用升序的排序方式,即1,2,3,4...这样的排序   public int[] sort(int[] num) {   for(int i=1;i<num.length;i++) {//i为哨兵,代表了i之前的数字都是排好序的,此次的循环是为了将i位置的数字加入到排序中   if(num[i]<num[i-1]) {//表示需要进行插入   int temp=num[i];//把这个数字插入到正确的位置,即前一个数<=temp<后一个数   int j=i;//前面已经排好序的长度+1   while(j>0 && num[j-1]>temp) {//j>0很重要(而且必须放在前面),不然的话数组很可能会越界   num[j] = num[j-1];//即j位置的数字后移,而j+1位置的数已经被保存了。   j--;   }   //此时,num[j-1]<=temp<num[j]   num[j]=temp;   }   }   return num;   }

//降序,即n,n-1,n-2...   public int[] sortDescend(int[] num) {   for(int i=1;i<num.length;i++) {   if(num[i-1] < num[i]) {//即新加的数字比之前排好序的数组中最小的一个(即最后一个)要大,即需要进行插入   int temp=num[i];   int j=i;   while(j>0 && num[j-1]<temp ) {   num[j]=num[j-1];   j--;   }   num[j]=temp;      }   }   return num;   }

  ok,直接插入排序就讲到这里。

  继续复习其他算法去了。233

 

原创粉丝点击