插入排序(insertion sort)
来源:互联网 发布:大推力火箭 知乎 编辑:程序博客网 时间:2024/05/17 00:12
插入排序是最简单的排序算法之一,其算法复杂度为O(n^2),最好的情况是O(n)。
算法简介
其实我们在打扑克牌时,就已经用到排序算法了。我们左手拿着的是已经排序号的扑克牌,右手从牌堆里抽取一张未排序的扑克,和左右的扑克从右向左意义比较知道找到这张牌的位置,将其插入到左手的牌中。
算法很简单,有几点需要注意的:
1,为什么是从右向左比较?
当要排序的数据是以数组(array)形式储存,而在一个数组中插入一个数据的算法复杂度为O(n)。所以,如果我们很笨拙的从左向右比较,那么这个算法的最好情况怎么会出现?对于第i个元素,我们要比较i-1次才能找到它的位置。那么算法最优情况就变成了,1+2+...+n次操作,复杂度为O(n^2),故最优情况O(n),不会出现。
而且,前面提到在数组中插入一个数的复杂度为O(n)。故,当我们对第i个元素进行排序时,找到其位置需要操作为j,那么将这个数插入到数组中,需要的操作为(i-j)。所以,对第i个元素进行排序的操作一定是i步操作。所以如果从左向右的话,那么这个算法就不会出现最优情况了。
但是,如果我们是对双向列表(double-linked list)进行插入排序的话,那么。从左向右,或者从右向左排序就都没有关系了。前者的最有情况是列表时反序的,后者是顺序的。
代码
package sorting;public class Data {/** * generate an unsorted array of length n * @param n length * @param max the maximum integer element of this array * @return an unsorted array consists of elements range from 1 to max */public static int[] getArray(int n, int max){int[] result = new int[n];for(int i =0; i < n; i++){result[i] = (int)(Math.random() * max + 1);}return result;}/** * print the array * @param arg array */public static void printArray(int[] arg){StringBuffer temp = new StringBuffer();for(int i = 0; i < arg.length; i++){temp.append(arg[i] + "\t");}System.out.println(temp);}}
package sorting;public class InsertionSort {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubInsertionSort is = new InsertionSort();int[] data = Data.getArray(10, 100);System.out.print("Source data:\t");Data.printArray(data);is.intsertionSort(data);System.out.print("Sorted data:\t");Data.printArray(data);}/** * sort the array in ascending order * @param arg */public void intsertionSort(int[] arg){int j = 0;int key = 0;for(int i =1; i < arg.length; i++){key = arg[i];for( j = i -1; j >= 0; j--){if(arg[j] > key){arg[j + 1] = arg[j];arg[j] = key;}else{break;}}}}}
- 插入排序(insertion sort)
- 插入排序(insertion sort)
- 插入排序(Insertion Sort)
- 插入排序(Insertion-sort)
- 插入排序(insertion sort)
- 插入排序(insertion sort)
- 插入排序(Insertion Sort)
- 插入排序(INSERTION-SORT)
- Insertion Sort(插入排序)
- Insertion Sort(插入排序)
- 插入排序(insertion sort)
- insertion sort 插入排序
- 插入排序(Insertion Sort)
- 插入排序 Insertion Sort
- 插入排序Insertion sort
- 插入排序 (Insertion Sort)
- 插入排序Insertion sort
- 插入排序 Insertion Sort
- 2440bsp wince启动分析
- arm assemble register
- 字符串全排列算法
- hp服务器+centos6.2+perl+lnmp
- Android TextView大全
- 插入排序(insertion sort)
- 全选/取消 gridview中checkbox的功能实现
- 动态链接库的数据及动态链接库重定向
- c语言时间比对
- Linux内核启动过程分析
- 国标码 区位码 机内码 输入码
- eclipse plugin
- linux下apache与subversion的安装
- C# DropDownList 控件SelectedItem总是取第一个ListItem的值原因