排序算法(插入排序)

  关于排序算法,常见的大致有:冒泡排序、插入排序、选择排序、快速排序、归并排序、桶排序、计数排序等。每一种排序算法都有它们各自的优劣和适用场景。一般可以从这么几个角度来衡量排序算法:

  1.最好时间复杂度、最坏时间复杂度、平均时间复杂度

  2.是否是原地排序算法:原地排序算法,指空间复杂度为O(1)

  3.是否是稳定排序算法:稳定排序算法,指如果待排序序列中有值相等的元素,经过排序之后,值相等元素的顺序保持不变

  关于插入排序算法(Insertion sort):

  

   代码实现:

  

/**
* 插入排序:
* 1.将数组中的数据分为两个区间:已排序区间、未排序区间
* 2.初始已排序区间,只有一个元素(第一个元素)
* 3.重复取未排序区间中的元素,插入到已排序区间的合适位置,保证有序区间一直有序
* 4.直到未排序区间元素为空,算法结束
* 5.插入排序是原地排序:空间复杂度O(1)
* 6.插入排序是稳定的排序
* 7.最好时间复杂度:O(n)
* 8.最坏时间复杂度、平均时间复杂度:都是O(n^2)
*
* @param a 待排序序列
* @param n 数据规模
*/
public static void insertionSort(int[] a,int n){
if(n <=1) return;

// 把数组中的数据分为:已排序区间、未排序区间
// 已排序区间初始只有第一个元素,其他元素都属于未排序区间
for(int i=1;i<n;++i){

// 从未排序区间取元素
int value=a[i];
// 移动数据(j是已排序区间的末尾坐标)
int j=i-1;
for(;j>=0;--j){
if(a[j]>value){
a[j+1]=a[j];
}else{// 不需要移动(当前j+1的位置,就是要插入元素的位置)
break;
}
}

//插入数据
a[j+1]=value;

}

}
我们唯一能够控制的是自己的脾气和努力
原文地址:https://www.cnblogs.com/itall/p/10900572.html