【算法】之直接插入排序

时间:2021-04-09 04:31:52

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

简单介绍:

    直接插入排序是一种简单的排序方法,具体做法是:在插入第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();
}
}
}
总结:

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