直接插入排序

要点
  • 时间复杂度:平均情况O(n2);最好情况O(n);最坏情况O(n2)。
  • 辅助空间:O(1)。
  • 直接插入排序是一种稳定的排序方式,是简单排序(冒泡、简单选择、直接插入)中性能最好的。
  • 基本思想:将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。
基本思路
  1. 默认待排记录的第一个关键字为已经排好的有序表
  2. 从待排记录的第二个关键字开始,与每个关键字的前一个关键字进行比较,如果比前一个关键字大,默认加入有序表尾,直到出现当前关键字比紧邻前一个关键字小的情况(或所有关键字都加入有序表尾,排序结束)
  3. 较小关键字被备份,紧邻前一个关键字向后移一位,备份与从右向左依次比较,如果关键字大则后移一位,如果备份大于某一关键字则这一关键字保持不动,备份加入这一关键字后面(原较大关键字已经后移);或备份比有序表表头关键字小,备份加入表头(表头比较后已经后移)。
  4. 待排记录中所有关键字都加入有序表,排序结束。
public void insertSort(int[] nums) {
		int guard, // 哨兵,较小关键字的备份
			 i, // 待排记录起始位置(下标) 
			 j; // 有序表指示下标,从大到小
		for (i = 1; i < nums.length; i++) {
			// 找到一个比表尾小的关键字
			if (nums[i] < nums[i - 1]) {
				guard = nums[i];  // 进行备份
				// 备份关键字在有序表中寻找合适位置
				for (j = i - 1; j >= 0 && nums[j] > guard; j--)
					nums[j + 1] = nums[j];
				// 备份关键字加入到有序表
				nums[j + 1] = guard; 
			}
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值