插入排序(c++)

插入排序(insert sort)是一种简单直观的排序方法。通过从前到后遍历数组,找到当前位置元素在已排序数组中的位置进行插入,将大于当前位置的元素全部向后移动一位,腾出一个插入的位置给当前元素。

//插入排序
void insertSort(vector<int>& nums)
{
	for (int i = 1; i < nums.size(); i++)
	{
		int key = nums[i];
		int j = i - 1;
		while (j >= 0 && nums[j] > key)
		{
			nums[j + 1] = nums[j];
			j--;
		}
		nums[j + 1] = key;
	}
}

插入排序是一种稳定的排序算法,即不会改变相同元素的相对位置,它的时间复杂度跟数据的情况有关:

最坏情况:元素倒序,O(^{}n^{2}).。

最好情况:有序,O(n),只需要进行n-1次比较即可。

平均情况下:需要进行部分比较和移动操作,时间复杂度为 O(n2)。

### C++插入排序实现C++ 中,插入排序可以通过遍历数组并将每个元素插入到之前已排序部分中的适当位置来完成。以下是基于给定资料的一个典型实现方式: ```cpp void insertionSort(int arr[], int n) { for (int i = 1; i < n; i++) { int key = arr[i]; int j = i - 1; // 将当前元素与之前的元素比较,并移动较大的元素 while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j--; } // 插入当前元素到正确的位置 arr[j + 1] = key; } } ``` 这段代码展示了如何使用 `for` 循环迭代整个列表,并利用内部的 `while` 循环将新项放置在其应有的地方[^1]。 另一种方法是在处理过程中引入所谓的“哨兵”,这可以简化边界条件下的逻辑判断: ```cpp void InsertSort(int *A, int n) { for (int i = 2; i < n; i++) if (A[i] < A[i - 1]) { A[0] = A[i]; // 使用第一个位置作为临时存储空间 int k = i - 1; while (A[0] < A[k]) A[k + 1] = A[k--]; A[k + 1] = A[0]; } } ``` 这里采用了一个额外的技术——设置一个虚拟的第一个元素(即所谓“哨兵”),使得当遇到需要调整顺序的情况时可以直接覆盖掉这个占位符而不会丢失任何实际的数据值[^2]。 无论是哪种版本,核心概念都是相同的:每次选取一个新的记录加入到现有的有序子集中去,直至所有的输入都被处理过为止[^3]。 #### 关键特性说明 - **时间复杂度**:平均情况下 O(n²),最坏情况也是 O(n²)[^4]。 - **稳定性**:保持相等关键字相对次序不变,因此它是稳定的排序算法之一。 - **适用场景**:适合于小规模数据集或是几乎已经是排好序的情况下应用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值