zoukankan      html  css  js  c++  java
  • 小朋友学数据结构(8):直接插入排序

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


  • 相关阅读:
    试图运行项目时出错,无法启动调试。没有正确安装调试器(转帖)
    IIS 401.2
    windows 2008 r2 64位运行crystal 2008的问题
    .net 命令行
    crystal report 2008 公式字段问题
    vs2003在IE8下无法调试的解决办法 (包括win2008 64位)
    Oninit里不能用ViewState
    web 开发的一些软件
    silverlight toolkit
    SqlConnection.Open的一些问题
  • 原文地址:https://www.cnblogs.com/alan-blog-TsingHua/p/9607589.html
Copyright © 2011-2022 走看看