【算法】之直接插入排序

    小编今天开始了算法的实践,现在来总结一下。

简单介绍:

    直接插入排序是一种简单的排序方法,具体做法是:在插入第i个元素时,R1、R2、……、Ri-1已经排好序,这时将Ri的关键字Ki依次与关键字Ki-1、Ki-2等进行比较,从而找到应该插入的位置并将Ri插入,插入位置及其后的记录依次向后移动。

    现在在讲解一个具体的栗子。

栗子:

    直接插入排序:从小到大排序
原序列:【8】【5】【10】【89】【5】【2】【0】【78】【6】【3】 


第一趟:【5】【8】【10】【89】【5】【2】【0】【78】【6】【3】

排序过程:【10】与【8】进行比较,10>8,位置不变,【10】也不再向前进行比较。


第二趟:【5】【8】【10】【89】【5】【2】【0】【78】【6】【3】

排序过程:【89】与【10】进行比较,89>10,位置不变,【89】也不再向前进行比较


第三趟:【5】【8】【10】【89】【5】【2】【0】【78】【6】【3】

排序过程:【5】与【89】进行比较,5<89,则继续与前一个元素进行比较,5<10,同理,发现5=5,(既不小于也不大于),所以【5】插在【5】的后面,可以发现相对位置没有发生变化。


第四趟:【5】【5】【8】【10】【89】【2】【0】【78】【6】【3】

排序过程:【2】与【89】进行比较,2<89,则继续与前一个元素进行比较,2<10,同理,直到2<5,所以【2】插入到【5】前面


第五趟:【2】【5】【5】【8】【10】【89】【0】【78】【6】【3】

排序过程:【0】与【89】进行比较,0<89,则继续与前一个元素进行比较,0<10,同理,直到0<2,所以【0】插入到【2】前面


第六趟:【0】【2】【5】【5】【8】【10】【89】【78】【6】【3】

排序过程:【78】与【89】进行比较,78<89,则继续与前一个元素进行比较,78>10,不再向前进行比较,所以【78】插入到【89】的前面


第七趟:【0】【2】【5】【5】【8】【10】【78】【89】【6】【3】

排序过程:【6】与【89】进行比较,6<89,则继续与前一个元素进行比较,6<78,同理,直到6>5,不再向前进行比较,所以【6】插入到【8】的前面


第八趟:【0】【2】【5】【5】【6】【8】【10】【78】【89】【3】

排序过程:【3】与【89】进行比较,3<89,则继续与前一个元素进行比较,3<78,同理,直到3>2,不再向前进行比较,所以【3】插入到【5】的前面


第九趟:【0】【2】【3】【5】【5】【6】【8】【10】【78】【89】

排序结束。

    看了具体的栗子之后,我想对于直接插入排序已经有了具体的认识,接下来看一下排序示意图。

排序示意图:


    看完文字叙述,那么来看一下如何用代码实现呢?

代码实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Direct_insertion_sort
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] a = new int[] { 8, 5, 10, 89, 5, 2, 0, 78, 6, 3 };  //定义一个无序数组,按照从小到大排序
            for (int i = 1; i < a.Length; i++)      
            {
                int temp = a[i];                   //给待排序元素做标记
                int j = i - 1;                     //待排序元素的前一个元素的索引
                while (j > -1 && temp < a[j])      //待排序元素与前一个元素进行比较
                {
                    a[j + 1] = a[j];               //如果待排序元素比前一个元素小,将前面的元素向后移动一个位置
                    j--;                    
                }
                a[j+1] = temp;                     //j--后,j+1是之前j所在的位置,将待排序元素放到合适的位置
            }
            for (int i = 0; i < a.Length; i++)
            {
                Console.WriteLine(a[i]);
            }
            Console.ReadKey();
        }
    }
}
总结:

   再明白原理之后,还需实践,然后进行多种方式实现,再去思考它的原理,然后会得到更加深刻的理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 57
    评论
评论 57
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值