您的位置:首页 > 其它

插入排序(insertion sort)

2012-05-04 16:04 609 查看
插入排序是最简单的排序算法之一,其算法复杂度为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
;
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 stub
InsertionSort 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;
}
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息