直接插入算法的学习记录

C#排序算法-直接排序和归并排序

一级目录

一:直接插入排序

思想:
直接插入排序是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。
这个句话怎么理解呢:这句话的重点是已排好的有序表中插入一个待排序的元素;
举个例子:

int[] array = new[] {8, 10, 50, 24, 13, 86, 16, 13, 14, 9, 6, 0};

这是一个无序数组对它进行排序
1.首先我们可以把第一个元素 8 看作是一个有序的表,(即8前面的数字都比 8 要小)。
2.把8之后的都看作为待排序的元素
好下面上代码解释

2.代码

   /// <summary>
    /// 直接插入排序
    /// </summary>
    /// <param name="array"></param>
  public static void StraightInsertionSort(int[] array) {
  //此时我们已经将8看作是有序的序列(即8前面的数字都比8小)
  //所以我们从待排的第一个元素开始遍历
        for (int i = 1; i < array.Length; i++) {
            int sentinel = array[i]; // 找出第一个待排元素
            int j = i - 1; //此时他要跟有序序列的最后一个元素进行比较
            //如果 j > 0 并且待排元素比有序的最后一个元素要小 则将有序元素进行后移一位 再此跟倒数第二未元素进行比较,直到找到比到比待排元素小的停止
            while (j >= 0 && sentinel < array[j]) {
                array[j + 1] = array[j];
                j--;
            }
            array[j + 1] = sentinel;
        }
    }

一:归并排序

推荐视频:归并排序视频讲解
首先看定义:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并
个人理解:1.首先由上面的直接插排序中我们可以把一个数字看成有序的序列。那么归并中第一步就是将无序序列分成两个序列;然后进行递归直至分到每个序列都是有序的(即每个数都看作一个序列)然后进行归并。
2.举例说明 例如

int[] array = new[] {5, 3, 4, 2};

可以分为【5,3】和【4,2】其中递归【5,3】又可以分为【5】和【3】此时都为有序序列
然后进行合:思想是对比有序序列末尾项谁小谁就填入到新数列中 【3,5】由此可知另一个为【2,4】然后再次进行合并为【2,3,4,5】

代码

    /// <summary>
    /// 归并排序
    /// </summary>
    /// <param name="array">数组</param>
    /// <param name="low">数组起始下标</param>
    /// <param name="high">数组末尾下标</param>
    public static void MergeSort(int [] array ,int low,int high)
    {
        //即分无可分
        if (low<high)
        {
            //分割线即取中间值
            int mid = (high + low) / 2;
            //递归
            MergeSort(array, low, mid);
            //递归
            MergeSort(array,mid+1, high);
            //合并
            Merge(array, low, mid, high);
        }
    }
    /// <summary>
    /// 归并两个有序数组
    /// </summary>
    /// <param name="array">原来数组</param>
    /// <param name="low">数组开始下标</param>
    /// <param name="mid">切割中间值-分割为两个数组</param>
    /// <param name="high">数组的结尾下标</param>
    public static void Merge(int[] array, int low, int mid, int high)
    {
        //新排列的列表
        int [] mergeArr = new int[high-low + 1];
        //第一个数组开始下标
        int left = low; 
        //第二个数组的开始下标值
        int right = mid + 1;
        int merge = 0;  //新数组的移动下标
        while (left <= mid && right <=high)
        {
            if (array[left] < array [right])
            {
                mergeArr[merge++] = array[left++];
            }
            else
            {
                mergeArr[merge++] = array[right++];
            }
        }
        //将剩下的填入数组中
        while (left<=mid)
        {
            mergeArr[merge++] = array[left++];
        }

        while (right <=high)
        {
            mergeArr[merge++] = array[right++];
        }

        merge = 0;
        //赋值数组
        while (low <=high)
        {
            array[low++] = mergeArr[merge++];
        }
    }

推荐学习算法的网站:算法学习-里面有演示
说明:本文章的代码原版为.Net中文网
最后:能力有限如果有解释不清楚的地方望原谅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值