小朋友学数据结构:直接插入排序

Posted alan-blog-tsinghua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小朋友学数据结构:直接插入排序相关的知识,希望对你有一定的参考价值。

小朋友学数据结构(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


技术分享图片

 












以上是关于小朋友学数据结构:直接插入排序的主要内容,如果未能解决你的问题,请参考以下文章

排序02-直接插入排序法

小朋友学数据结构:归并排序

算法学习之排序算法(直接插入排序法)

这8种常见的Java排序算法,学算法必看!

数据结构直接插入排序

一文学懂经典算法系列之:直接插入排序(附讲解视频)