数据结构和算法-004 数组排序 插入排序
2015-06-07 04:14
591 查看
插入排序
⒈ 从第一个元素开始,该元素可以认为已经被排序
⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
⒋ 重复步骤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
看代码
描述
一般来说,插入排序都采用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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统