数据结构和算法-004 数组排序 插入排序

插入排序


描述

一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

⒈ 从第一个元素开始,该元素可以认为已经被排序

⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描

⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置

⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

⒌ 将新元素插入到下一位置中

⒍ 重复步骤2~5


算法复杂度

如 果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需 (n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数加上 (n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例 如,量级小于千,那么插入排序还是一个不错的选择。



稳定性

插 入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始, 也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等 的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定 的。



Note:参考百度百科  http://baike.baidu.com/subview/396887/396887.htm#3


看代码

public class ArrayStructures {
    
    private int[] theArray = new int[50];
    
    private int arraySize = 10;
    
    public void generateRandomArray(){
        for (int i =0; i< arraySize;i++){
            theArray[i] = (int)(Math.random()*10 + 10);
        }
    }
    
    public void printArray(){
        StringBuffer sb = new StringBuffer("-");
        for (int i = 0; i<arraySize; i++){
            sb.append("-----");
        }
        
        String septalLine= sb.toString();
        
        System.out.println(septalLine);
        for (int i = 0; i<arraySize; i++){
            System.out.print("|  " + i + " ");
        }
        System.out.println("|");
        System.out.println(septalLine);
        for (int i = 0; i<arraySize; i++){
            System.out.print("| " + theArray[i] + " ");
        }
        System.out.println("|");
        System.out.println(septalLine);
    }
    
    }
    
    public void insertionSort(){
        for(int i=1; i<arraySize; i++){
            int j= i;
            int insertValue = theArray[i];
            while (j>0 && theArray[j-1]>insertValue){
                theArray[j]= theArray[j-1];
                j--;
            }
            theArray[j]=insertValue;
        }
    }
    

    public static void main(String[] args) {
        // Generate an Array 
        System.out.println("Create an array, and fill in random value");
        ArrayStructures as = new ArrayStructures();
        // Set Random value in Array 
        as.generateRandomArray();
        // Print original array 
        as.printArray();
        System.out.println();
        
        
        System.out.println("Insertion Sort");
        as.insertionSort();
        as.printArray();
        System.out.println();
        
    }

}

输出结果

Create an array, and fill in random value
---------------------------------------------------
|  0 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 |
---------------------------------------------------
| 11 | 15 | 14 | 10 | 13 | 16 | 18 | 18 | 11 | 14 |
---------------------------------------------------

Insertion Sort
---------------------------------------------------
|  0 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 |
---------------------------------------------------
| 10 | 11 | 11 | 13 | 14 | 14 | 15 | 16 | 18 | 18 |
---------------------------------------------------


你可能感兴趣的:(java,排序,数组)