数据结构:常见的排序算法(二):直接插入排序
插入排序:
1.思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置,直到全部插入排序完为止。
2.关键问题:在前面已经排好序的序列中找到合适的插入位置。
方法: 分为 直接插入排序 、二分插入排序、希尔排序
直接插入排序
1.基本思想:
每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。(是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。)
2.示例
*** 示例1:对数组a[6]={20,30,40,10,60,50},用直接插入法进行排序 ***
【图片来源: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}用直接插入排序进行排序
【图片来源: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 公众号,欢迎大家关注!欢迎催更!留言!