数据结构:常见的排序算法(二):直接插入排序(C++实现)

数据结构:常见的排序算法(二):直接插入排序

插入排序:

1.思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置,直到全部插入排序完为止。
2.关键问题:在前面已经排好序的序列中找到合适的插入位置。
方法: 分为 直接插入排序二分插入排序希尔排序

直接插入排序

1.基本思想:

每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。(是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。)

2.示例

*** 示例1:对数组a[6]={20,30,40,10,60,50},用直接插入法进行排序 ***

img

【图片来源:https://www.cnblogs.com/zwtgyh/p/10631760.html】

代码实现

第一种实现方法:利用两个for循环

#include<iostream>
#include<cstdio>
using namespace std;
int main() {
	/* 插入排序*/
	int num[6] = { 20, 30, 40, 10, 60, 50 };
	int temp;
	int i, j;
	int length = sizeof(num) / sizeof(num[0]);
	for (i = 1; i < length; i++)
	{
		temp = num[i];    //待排序元素
		for (j = i - 1; j >= 0 && num[j] > temp; j--)
		{
			num[j + 1] = num[j];
		}
		num[j + 1] = temp;
	}
	for (int i = 0; i < length; i++)
	{
		cout << num[i] << " ";
	}
	return 0;
}

第二种实现方法:

#include<iostream>
#include<cstdio>
using namespace std;
int main() {
	/* 插入排序*/
	int num[6] = { 20, 30, 40, 10, 60, 50 };
	int pos, temp;
	int length = sizeof(num) / sizeof(num[0]);
	for (int i = 1; i < length; i++)
	{
		pos = i - 1;    //有序序列的最后一个元素位置
		temp = num[i];    //保存待排序元素的值
		while (pos >= 0 && num[pos] > temp)
		{
			num[pos + 1] = num[pos];
			pos--;
		}
		num[pos + 1] = temp;    //将待排序元素插入数组中
	}
	for (int i = 0; i < length; i++)
	{
		cout << num[i] << " ";
	}
	return 0;
}

**示例2:对数组b[15]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48}用直接插入排序进行排序

img

【图片来源:https://www.cnblogs.com/zwtgyh/p/10631760.html】

代码实现

方法同上,两种方法均可实现

方法一:

#include<iostream>
#include<cstdio>
using namespace std;
int main() {
	/* 插入排序*/
    int num[15] = { 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48 };
	int temp;
	int i, j;
	int length = sizeof(num) / sizeof(num[0]);
	for (int i = 1; i < length; i++)
	{
		temp = num[i];    //待排序元素
		for (int j = i - 1; j >= 0 && num[j] > temp; j--)
		{
		C	num[j + 1] = num[j];
		}
		num[j + 1] = temp;
	}
	for (int i = 0; i < length; i++)
	{
		cout << num[i] << " ";
	}
	return 0;
}

方法2:

#include<iostream>
#include<cstdio>
using namespace std;
int main() {
	/* 插入排序*/
	int num[15] = { 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48 };
	int pos, temp;
	int length = sizeof(num) / sizeof(num[0]);
	for (int i = 1; i < length; i++)
	{
		pos = i - 1;    //有序序列的最后一个元素位置
		temp = num[i];    //保存待排序元素的值
		while (pos >= 0 && num[pos] > temp)
		{
			num[pos + 1] = num[pos];
			pos--;
		}
		num[pos + 1] = temp;    //将待排序元素插入数组中
	}
	for (int i = 0; i < length; i++)
	{
		cout << num[i] << " ";
	}
	return 0;
}
3.总结:

1、插入排序的最好情况是数组已经有序,此时只需要进行n-1次比较,时间复杂度为O(n)

2、最坏情况是数组逆序排序,此时需要进行n(n-1)/2次比较以及n-1次赋值操作(插入)

3、平均来说插入排序算法的复杂度为O(n2)

4、空间复杂度上,直接插入法是就地排序,空间复杂度为(O(1))

公众号:平平无奇代码猴
也可以搜索:Jackiie_wang 公众号,欢迎大家关注!欢迎催更!留言!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值