插入排序
插入排序是一种稳定的排序算法。
基本思想:
把N个待排序元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有N-1个元素;每次从无序表中取出一个元素,将它插入到有序表中,使之成为新的有序表,重复N-1次完成整个排序过程。
算法分析:
1)从序列第一个元素开始,该元素可以认为已经被排序;
2)去下一个元素设为待插入元素,在已排序的序列中从后向前扫描,如果该元素大于带插入元素,将该元素移到下一个位置;
3)重复步骤2),直到找到已排序的元素小于或等于待排序元素的位置,插入元素;
4)重复2),3)步骤,完成排序。
时间复杂度:
1)顺序排列时,只需比较(N-1)次,插入排序的时间复杂度为O(n);
2)逆序排序时,只需比较N(N-1)/2 次,插入排序时间复杂度为O(n2);
3)当原始序列是无序时,平均时间复杂度为O(n2);
空间复杂度:
插入排序过程中,需要一个临时变量temp存储待排序元素,因此空间复杂度为O(1)
排序过程图:
接下来看一下具体的Java代码实现:
第一种形式:
1 public void sort(int arr[]) { 2 for(int i =1; i<arr.length;i++) { 3 int insertVal = arr[i]; //插入的数 4 int index = i-1; //被插入的位置(准备和前一个数比较) 5 while(index>=0&&insertVal<arr[index]) { //如果插入的数比被插入的数小 6 arr[index+1]=arr[index]; //将把 arr[index] 向后移动 7 index--; //让 index 向前移动 8 } 9 arr[index+1]=insertVal; //把插入的数放入合适位置 10 } 11 }
第二种形式:
1 public class InsertSort { 2 public static void main(String[] args) { 3 int a[] = {3,1,5,7,2,4,9,6}; 4 new InsertSort().insertSort(a); 5 } 6 //直接插入排序算法的实现 7 private void insertSort(int[] a) { 8 for( int i=1;i<a.length;i++){ 9 int temp = a[i]; //temp为本次循环待插入有序列表中的数 10 for(int j=i-1;j>=0 && a[j]>temp;j--){ //寻找temp插入有序列表的正确位置 11 a[j+1] = a[j]; //元素后移,为插入temp做准备 12 } 13 a[j+1] = temp; //插入temp 14 print(a,a.length,i); 15 } 16 printResult(a,a.length); 17 } 18 //打印排序的最终结果 19 private void printResult(int[] a){ 20 System.out.print("最终排序结果:"); 21 for(int j=0;j<a.length;j++){ 22 System.out.print(" "+a[j]); 23 } 24 System.out.println(); 25 } 26 // 打印排序的每次循环结果 27 private void print(int[] a, int i) { 28 System.out.print("第"+i+"次:"); 29 for(int j=0;j<a.length;j++){ 30 System.out.print(" "+a[j]); 31 } 32 System.out.println(); 33 } 34 }