插入排序(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)进行插入排序的话,那么。从左向右,或者从右向左排序就都没有关系了。前者的最有情况是列表时反序的,后者是顺序的。
算法简介
其实我们在打扑克牌时,就已经用到排序算法了。我们左手拿着的是已经排序号的扑克牌,右手从牌堆里抽取一张未排序的扑克,和左右的扑克从右向左意义比较知道找到这张牌的位置,将其插入到左手的牌中。算法很简单,有几点需要注意的:
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; } } } } }
相关文章推荐
- 选择排序(Selection Sort)和插入排序(Insertion Sort)
- Leetcode Insertion Sort List 插入排序链表
- PAT甲题题解1098. Insertion or Heap Sort (25)-(插入排序和堆排序)
- insertionSort()插入排序
- 插入排序(INSERTION-SORT)
- 算法总结JS版(三)—— 插入排序(Insertion Sort)
- [算法练习]Insertion Sort 插入排序
- 插入排序(InsertionSort)
- 排序算法——插入排序(Insertion Sort)
- 插入排序(InsertionSort)
- Python 数据结构与算法——插入排序(insertion sort)
- 插入排序:直接插入排序-Direct insertion sort
- 插入排序 insertion sort
- 【算法】插入排序(Insertion Sort)
- insertion sort(插入排序)
- Java 插入排序(Insertion Sort)
- 【算法】插入排序 insertion_sort
- 插入排序(insertion-sort)
- 插入排序(INSERTION-SORT)
- Insertion_Sort(插入排序)