小朋友学数据结构(8):直接插入排序
(一)基本思想
在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。
1-1.jpg
(二)C语言代码实现
#include<stdio.h>
void insertSort(int a[], int n)
{
int i, j, temp;
for (i = 1; i < n; i++)
{
temp = a[i];
j = i;
// 将大于temp的值整体后移一个单位
while(j > 0 && a[j-1] > temp)
{
a[j] = a[j-1];
j--;
}
a[j]=temp;
}
}
int main()
{
int arr[] = {57, 68, 59, 52};
int len = sizeof(arr) / sizeof(int);
insertSort(arr, len);
int i = 0;
for(; i < len; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
运行结果:
52, 57, 59, 68
程序分析:
for循环中,
(1) i = 1, temp = a[1] = 68, j = 1, a[0] = 57, a[0] > temp不成立,不需要调整
(2)i = 2,temp = a[2] = 59,
① j = 2,a[1] = 68 > temp,执行循环a[2] = a[1] = 68,j自减。
② j = 1, a[0] = 57 > temp不成立,循环结束。
③ 最后执行a[1] = temp = 59,此时arr = {57,59,68,52}
(3)i = 3,temp = a[3] = 52
① j = 3, a[2] = 68 > temp,执行循环a[3] = a[2] = 68,j自减
② j = 2,a[1] = 59 > temp,执行循环a[2] = a[1] = 59,j自减
③ j = 1,a[0] = 57 > temo,执行循环a[1] = a[0] = 57,j自减后变为0,循环结束
④ 最后执行a[0] = temp = 52,此时a= {52, 57, 59, 68}
(三)《大话数据结构》中的程序
#include<iostream>
using namespace std;
#define MAX 5
typedef struct
{
int r[MAX + 1];
int len;
}seq;
void myswap(seq *x, int i, int j)
{
int temp = x->r[i];
x->r[i] = x->r[j];
x->r[j] = temp;
}
void insertSort(seq *x)
{
int j = 0;
for (int i = 2; i <= x->len; i++)
{
if (x->r[i] < x->r[i - 1])
{
x->r[0] = x->r[i]; // X->r[0]作为哨兵,即临时变量
for (int j = i - 1; x->r[j] > x->r[0]; j--)
{
x->r[j + 1] = x->r[j];
}
x->r[j + 1] = x->r[0];
}
}
}
int main()
{
cout << "输入数据:";
seq s;
for(int i = 1; i <= MAX; i++)
{
cin >> s.r[i];
}
s.len = MAX;
insertSort(&s);
cout << "排序结果:";
for(int i = 1; i <= s.len; i++)
{
cout << s.r[i] << ‘ ‘;
}
cout << endl;
return 0;
}
运行结果:
输入数据:5 4 3 2 1
排序结果:1 2 3 4 5
原文地址:https://www.cnblogs.com/alan-blog-TsingHua/p/9607589.html
时间: 2024-10-12 18:07:29