java 插入排序

来源:互联网 发布:职场鸡汤 知乎 编辑:程序博客网 时间:2024/06/03 04:10

插入排序


       彪哥的性格就是先看代码,代码如下:


public class InsertionSort {

    public static void main(String[] args) {
    int [] arr = {5,2,9,7,3,1,4,6,8,0};
    //排序前
    for(int i:arr){
    System.out.print(i+" ");
    
    System.out.println();
    

           int in, out;
   for (out=1;out<arr.length;  out++) {   
   int temp=arr[out];  
   in=out; 
   while(in>0 && arr[in-1]>=temp)
   {
      arr[in]=arr[in-1];
       --in; 

   }

   arr[in] = temp;
   } 


    //排序后
    for(int i:arr){
    System.out.print(i+" ");
    }
    
    } 
}


5 2 9 7 3 1 4 6 8 0 
0 1 2 3 4 5 6 7 8 9 


      在外层的for循环中,out变量从1开始,向右移动。它标记了未排序部分的最左端的数据。

     在内层的while循环中,in变量从out变量开始,向左移动,直到temp变量大于in-1所指的数组数据项,或者它已经不能再往左移动为止。while循环的       每一趟都向右移动了一个已排序的数据项


 详细解释:


   

 局部有序
      outer 是被标记的队员,outer左边的所有队员已经是局部有序的了。这意味着这一部分人之间是按顺序排列的,每个人比他/她左边的人都高。然而这些队员在队列中最终的位置还没有确定,因为当没有被排过序的队员要插入到他们中间的时候,他们的位置还要发生变动。outer本身和他右边所有的队员都是未排过序的。
    

    

    下面将要做的是在(局部)有序组中的适当位置插入被标记的队员outer。然而要做到这一点,需要把部分已排序的队员右移以腾出空间。为了提供移动所需的空间,就先让被标记的队员outer出列。(在程序中,这个数据项被存储在一个临时变量temp中。)现在移动已经排过序的队员来腾出空间。将局部有序中最高的队员移动到原来被标记队员所在位置,次高的队员移动到原来最高的队员所在的位置,依此类推。这个移动过程什么时候结束昵?假设你和被标记的队员一起向队列的左端移动。在每个位置上,队员都向右移动一位,同时被标记的队员和下一个要移动的队员比较身高。当把最后一个比被标记的队员还高的队员移位之后,这个移动的过程就停止了。最后一次移位空出的位置,就是被标记队员应该插入的位置。


插入排序的效率

               对于已经有序或基本有序的数据来说,插入排序要好得多。

0 0
原创粉丝点击