题目:
数据结构-直接插入排序 - C语言网 (dotcpp.com)
算法分析:
直接插入排序是把新的数据插入以及排序好的数列中,排序的基本方法是:每一步将一个待排序的元素,按其排序码的大小,插入到前面已经排好序的一组元素的适当位置上去,直到元素全部插入为止。
1. 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
2. 第一趟比较前两个数,然后把第二个数按大小插入到有序表中;
3. 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;
4. 依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
图示示例:
详细图解可以参考这篇文章
排序算法——直接插入排序(图文超详细!)-CSDN博客
代码:
代码最重要也是最容易错误的地方在于, j >= 0&& arr[j] > temp;这个条件是要求j遍历数组时最小为0,同时arr[j]>temp,temp是当前趟数中需要往前移动的值(其实就是arr[i],但是我们用一个变量来存)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//题目 1714: 数据结构-直接插入排序
int main()
{
int n;
int arr[100];
int i = 0, j = 0, temp;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (i = 1; i < n; i++)
//2 8 4 6 1 10 7 3 5 9
// j i
{
if (arr[i - 1] > arr[i])
{
temp = arr[i];
for (j = i - 1; j >= 0&& arr[j] > temp; j--)
{
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
/*第二个版本主要修改在
for (j = i - 1; j >= 0; j--) {
if (arr[j] > temp) {
arr[j + 1] = arr[j];
}
else
{
break;
}
}*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//题目 1714: 数据结构-直接插入排序
int main()
{
int n;
int arr[100];
int i = 0, j = 0, temp;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (i = 1; i < n; i++)
//2 8 4 6 1 10 7 3 5 9
// 2 4
// j i
{
if (arr[i - 1] > arr[i])
{
temp = arr[i];
for (j = i - 1; j >= 0; j--) {
if (arr[j] > temp) {
arr[j + 1] = arr[j];
}
else
{
break;
}
}
arr[j + 1] = temp;
}
}
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
样例输入:
10
2 8 4 6 1 10 7 3 5 9
样例输出:
复杂度与稳定性
最坏情况:O(N^2)
最好情况:O(N^2)
平均情况:O(N^2)
稳定性:稳定排序