一. 算法描述
插入排序:插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序。例如有一个长度为N的无序数组,进行N-1次的插入即能完成排序;第一次,数组第1个数认为是有序的数组,将数组第二个元素插入仅有1个有序的数组中;第二次,数组前两个元素组成有序的数组,将数组第三个元素插入由两个元素构成的有序数组中......第N-1次,数组前N-1个元素组成有序的数组,将数组的第N个元素插入由N-1个元素构成的有序数组中,则完成了整个插入排序。
以下面5个无序的数据为例:
65 27 59 64 58 (文中仅细化了第四次插入过程)
第1次插入: 27 65 59 64 58
第2次插入: 27 59 65 64 58
第3次插入: 27 59 64 65 58
第4次插入: 27 58 59 64 65
二. 算法分析
平均时间复杂度:O(n2)
空间复杂度:O(1) (用于记录需要插入的数据)
稳定性:稳定
三、代码
1、自己写的代码:
public static void insrtionSort(int[] arr){
//定义临时变量存储位置i上的变量值
int temp=0;
//外层循环从arr[1]开始遍历,总共执行N-1次(趟)
for (int i = 1; i < arr.length; i++) {
//对于每次比较,知道找到正确位置插入为止
for (int j = i; j >0; ) {
//任意两个元素的比较
if(arr[j]<arr[j-1]){
temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
//如果执行比较交换数据,则再往前推进
j--;
}else{
//如果位置正确,则跳出循环
break;
}
}
}
}
public static void main(String[] args) {
int [] arr=new int[]{34,8,64,51,32,2,212,32,-1,-9,1214,21,212,345,1,34,1,0,100,22,21};
//定义一个中间变量
insrtionSort(arr);
System.out.println(Arrays.toString(arr));
}
2、借鉴其他博主:
1、
/********************************************************
*函数名称:InsertSort
*参数说明:pDataArray 无序数组;
* iDataNum为无序数据个数
*说明: 插入排序
*********************************************************/
void InsertSort(int* pDataArray, int iDataNum)
{
for (int i = 1; i < iDataNum; i++) //从第2个数据开始插入
{
int j = 0;
while (j < i && pDataArray[j] <= pDataArray[i]) //寻找插入的位置
j++;
if (j < i) //i位置之前,有比pDataArray[i]大的数,则进行挪动和插入
{
int k = i;
int temp = pDataArray[i];
while (k > j) //挪动位置
{
pDataArray[k] = pDataArray[k-1];
k--;
}
pDataArray[k] = temp; //插入
}
}
}
2、
public static void insertion_sort(int[] unsorted)
{
for (int i = 1; i < unsorted.length; i++)
{
if (unsorted[i - 1] > unsorted[i])
{
int temp = unsorted[i];
int j = i;
while (j > 0 && unsorted[j - 1] > temp)
{
unsorted[j] = unsorted[j - 1];
j--;
}
unsorted[j] = temp;
}
}
}
public static void main(String[] args)
{
int[] x = { 6, 2, 4, 1,-12,21,31, 5, 9 };
insertion_sort(x);
System.out.println(Arrays.toString(x));
}
转载于:https://blog.51cto.com/smallcoder/1844768