(是稳定的,时间复杂度O(n^2)),性能上比冒泡和选择好一点
降序
- 从第1位元素开始,比较第1与第0大小,后者比前者大就交换,就排好了前2位元素。
- 让第2位元素与第1位元素比较,后者比前者大就交换,再让第1位与第0位比较,后者比前者大就交换,就排好了前3位元素。如果后者没前者大就结束排序。
- 让第n位与前n个排好的元素依次比较,后者比前者大就交换,如果后者没前者大就结束排序。依次类推。。。(注:第0位元素为第1个)
c++实现:
1 #include <iostream> 2 3 using namespace std; 4 5 void sort(int *array) 6 7 { 8 9 for(int i=1;i<10;i++) 10 11 { 12 13 for(int j=i-1;array[i]>array[j]&&j>=0;j--,i--) 14 15 swap(array[i],array[j]); 16 17 } 18 19 } 20 21 void main() 22 23 { 24 25 int array[10]={5,2,1,7,8,9,4,1,3,10}; 26 27 sort(array); 28 29 for(int i=0;i<10;i++) 30 31 cout<<array[i]<<" "; 32 33 }
java实现:
package com.sort; public class Sort { public static void print(int list[]){ for(int i=0;i<list.length;i++){ System.out.println(list[i]); } } public static void insertSort(int list0[]){ int i,j; /*新建一个比原数组长度大1的数组,第一位元素为0*/ int list[] = new int[list0.length+1]; list[0] = 0; for(i=1;i<list.length;i++){ list[i] = list0[i-1]; } /** * {6,4,2,5,8,7,3,9,0,1} * {0,6,4,2,5,8,7,3,9,0,1} * 循环1 * l[2]=4和它前一个元素l[1]=6比,比它小 * l[0]=l[2]=4,l[1]=6覆盖l[2]=4,此时l[2]=6,l[1]=6 * l[0]=4覆盖l[1],此时{4,4,6,2,5,8,7,3,9,0,1} 1到2号元素是排好序的 * 循环2 * l[3]=2和它前一个元素l[2]比较,比它小 * l[0]=l[3]=2,...{2,2,4,6,5,8,7,3,9,0,1} 此时1到3号元素是排好序的 * l[4]=5和它前一位比较,先把这个元素放到l[0],然后比它大的元素依次往后移一位,l[0]再插入到腾出来的那个位置 * {5,2,4,5,6,8,7,3,9,0,1}此时1到4号元素是排好序的 * 依次类推.... * * */ //排序 for(i=2;i<list.length;i++){ if(list[i] < list[i-1]){ list[0] = list[i]; for(j=i-1;list[j] > list[0];j--){ list[j+1] = list[j]; } list[j+1] = list[0]; } } //收尾,把排好序的元素放回list0,去掉那个缓冲区0号元素 for(i=1;i<list.length;i++){ list0[i-1] = list[i]; } } public static void main(String[] args) { int list0[] = new int[]{6,4,2,5,8,7,3,9,0,1}; // int list1[] = new int[]{9,8,7,6,5,4,3,2,1,0}; // int list2[] = new int[]{2,1,3,4,5,6,7,8,9}; insertSort(list0); print(list0); } }