C#插入排序算法

举报
Rolle 发表于 2024/10/31 00:06:22 2024/10/31
【摘要】 插入排序(Insertion Sort)是一种简单直观的排序算法,它的工作原理类似于我们整理扑克牌的过程。想象一下,如果你手中有一些扑克牌,你会一张一张地将它们插入到已经排序好的牌堆中。每次,你都会找到牌堆中正确的位置,将新牌插入进去,以保持牌堆的有序。插入排序的工作原理正是如此,它不断地将未排序的元素插入到已排序序列中。插入排序的基本原理插入排序的基本思想是:通过构建有序序列,对于未排序数...

插入排序(Insertion Sort)是一种简单直观的排序算法,它的工作原理类似于我们整理扑克牌的过程。想象一下,如果你手中有一些扑克牌,你会一张一张地将它们插入到已经排序好的牌堆中。每次,你都会找到牌堆中正确的位置,将新牌插入进去,以保持牌堆的有序。插入排序的工作原理正是如此,它不断地将未排序的元素插入到已排序序列中。

插入排序的基本原理
插入排序的基本思想是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为新元素提供插入空间。

插入排序的算法步骤
从第一个元素开始,该元素可以认为已经被排序。
取出下一个元素,在已经排序的元素序列中从后向前扫描。
如果该元素(已排序)小于新元素,将该元素移到下一位置。
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置。
将新元素插入到该位置后。
重复步骤2~5。
插入排序的C#实现
下面是一个插入排序算法的C#实现示例:
using System;

class Program
{
static void Main()
{
int[] arr = { 9, 5, 1, 4, 3 };
int n = arr.Length;

    for (int i = 1; i < n; i++)
    {
        int key = arr[i];
        int j = i - 1;

        // 将arr[i]插入到已排序序列arr[0...i-1]中的适当位置
        while (j >= 0 && arr[j] > key)
        {
            arr[j + 1] = arr[j];
            j = j - 1;
        }
        arr[j + 1] = key;
    }

    Console.WriteLine("Sorted array:");
    foreach (int value in arr)
    {
        Console.Write(value + " ");
    }
}

}
在这个示例中,我们首先定义了一个未排序的整数数组arr。然后,我们使用一个循环来遍历数组的每个元素。对于每个元素,我们将它与前面已排序的元素进行比较,并在必要时将这些元素向后移动,以腾出空间将当前元素插入到正确的位置。

插入排序的性能分析
插入排序的平均和最坏情况时间复杂度都是O(n^2),其中n是数组的长度。这是因为插入排序需要进行多次的元素比较和移动。在最好的情况下,如果数组已经是排序好的,插入排序的时间复杂度是O(n),因为它只需要进行一次遍历就可以完成排序。

插入排序的空间复杂度是O(1),因为它只需要一个额外的存储空间来存储当前要插入的元素。

插入排序的优化
尽管插入排序的时间复杂度较高,但我们可以通过一些技巧来优化它。例如,我们可以使用二分查找来减少插入过程中的比较次数,或者使用希尔排序的思想来减少元素移动的次数。

下面是一个优化后的插入排序算法的C#实现示例,使用二分查找来减少比较次数:
using System;

class Program
{
static void Main()
{
int[] arr = { 9, 5, 1, 4, 3 };
int n = arr.Length;

    for (int i = 1; i < n; i++)
    {
        int key = arr[i];
        int j = i - 1;

        // 使用二分查找找到插入的位置
        while (j >= 0 && BinarySearch(arr, key, j) > 0)
        {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }

    Console.WriteLine("Sorted array:");
    foreach (int value in arr)
    {
        Console.Write(value + " ");
    }
}

static int BinarySearch(int[] arr, int key, int hi)
{
    int low = 0;
    int mid;

    while (low <= hi)
    {
        mid = (low + hi) / 2;
        if (arr[mid] < key)
        {
            low = mid + 1;
        }
        else
        {
            hi = mid - 1;
        }
    }
    return low;
}

}
在这个优化后的示例中,我们引入了一个辅助方法BinarySearch来使用二分查找找到插入的位置。这样,我们可以减少插入过程中的比较次数,从而提高排序的效率。

插入排序的应用场景
尽管插入排序的时间复杂度较高,但它仍然有一些应用场景。例如,当待排序的数组已经接近于排序完成,或者数组的大小较小时,插入排序可以快速地完成排序。此外,插入排序的实现简单,易于理解,适合作为教学示例。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。