算法系列-------直接插入排序(InsertionSort)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法系列-------直接插入排序(InsertionSort)相关的知识,希望对你有一定的参考价值。

一. 算法描述

    插入排序插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序。例如有一个长度为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));
     }

以上是关于算法系列-------直接插入排序(InsertionSort)的主要内容,如果未能解决你的问题,请参考以下文章

排序系列 之 直接插入排序算法 —— Java实现

排序系列 之 折半插入排序算法 —— Java实现

算法系列-------直接插入排序(InsertionSort)

排序算法系列1--简单排序(选择,冒泡,直接插入)

白话经典算法系列之二 直接插入排序的三种实现

排序算法系列:插入排序算法