您的位置:首页 > 理论基础 > 数据结构算法

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

2015-06-07 04:14 591 查看
插入排序

描述

一般来说,插入排序都采用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 排序