Java学习之插入排序及其复杂度

本文详细介绍了插入排序算法的实现步骤和代码示例,包括初始化比较数据的下标,使用临时变量存储待比较数值,以及通过循环比较和数据后移实现排序的过程。同时,文章还提供了插入排序的时间复杂度分析,包括最好和最坏情况下的比较和移动次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

插入排序步骤

  1. 记录要比较数据的下标index, 初始为1;
  2. 临时存储下标index的值,temp;
  3. 利用temp与index前的数据依此进行比较,如果temp<arr[index-1],则arr[index-1]后移一位,index - - ,直到temp >= arr[index-1] 或者 index == 0;
  4. 如果temp >= arr[index-1],则将arr[index]=temp;
  5. 如果index ==0 ,则将arr[index]=temp;
  6. 重复上述步骤

比较分析
在这里插入图片描述

插入排序代码

package com.sort.util;

public class InsertSort {
	
	public static void insertSort(int arr[]) {
		//  3 5 1 9 7 2
		
		
		for(int i=1;i<arr.length;i++) {
			
			int index = i;   //记录比较数据的下标
			int temp = arr[index];  //临时存储要比较的数据
			
			while(index > 0 && temp < arr[index-1]) {
			//当index>0且temp<前面已排序好的数据时,数据进行后移	
				arr[index] = arr[index-1];
				index--;
			
			}
			
			//当index=0时,将临时存储数据temp赋值给arr[index]
			arr[index] = temp;
		}
	}
	
	public static void main(String[] args) {
		int arr[] = {3,5,1,9,7,2};
		InsertSort.insertSort(arr);
		for(int i=0;i<arr.length;i++) {
			System.out.println(arr[i]);
		}
	}
}

复杂度分析

  1. 最好的情况(数据已经有序)
    比较次数:n-1 (每次循环只比较一次)
    移动次数:0
  2. 最坏的情况
    比较次数:2+3+4+……+n=(n+2)n/2 (每次都要比较到index==0)
    移动次数:1+2+3+……+n-1=n*n/2

由此得出:直接插入排序的时间复杂度为 o(n^2)

### 插入排序算法的空间复杂度分析 插入排序是一种原地排序算法,这意味着它不需要额外的存储空间来完成排序过程。其核心思想是通过逐步构建有序子列表并将新元素插入到合适的位置实现整个数据集的排序。 在实际操作中,插入排序仅需少量变量用于辅助运算,例如临时变量用来保存当前正在处理的数据项以便进行比较和交换。因此,除了输入数组本身外,几乎不再需要任何额外内存支持这些操作[^2]。具体来说: - **主要特性**: 插入排序属于原地排序算法类别之一,这类算法的特点在于它们执行过程中所使用的额外空间非常有限。 由于以上原因,可以得出结论:**插入排序空间复杂度为 O(1)**,即常量级空间需求[^3]。 以下是基于 Java 的一个典型插入排序实现示例,展示了如何利用固定数量的额外变量来进行排序而不依赖外部资源分配: ```java public class InsertionSort { public static void sort(int[] array) { for (int i = 1; i < array.length; ++i) { int key = array[i]; int j = i - 1; while (j >= 0 && array[j] > key) { array[j + 1] = array[j]; j--; } array[j + 1] = key; } } public static void main(String args[]) { int[] data = {9, 5, 1, 4, 3}; sort(data); System.out.println("Sorted Array:"); for (int value : data) { System.out.print(value + " "); } } } ``` 此代码片段清楚表明,在排序期间并未引入新的大型结构体或者动态调整大小的对象集合;所有的修改都发生在原始 `array` 上面,并且只用了几个局部整型变量作为中介工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值