热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#中常见的排序算法详解

本文详细介绍了C#中几种常见的排序算法,包括冒泡排序、选择排序、插入排序、希尔排序和快速排序,并提供了相应的代码示例。

本文将详细介绍 C# 中几种常见的排序算法,帮助读者更好地理解和应用这些算法。每种算法都附有详细的解释和代码示例,以便读者能够轻松上手。



冒泡排序


介绍

冒泡排序是一种简单的排序算法,其基本思想是通过多次遍历数组,每次比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。这样,每一轮遍历都会将当前未排序部分的最大值移动到末尾。冒泡排序的时间复杂度为 O(n²)。



动图演示

冒泡排序动图



代码示例


public static int[] BubbleSort(int[] arr)
{
for (int i = 0; i {
for (int j = 0; j {
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}


选择排序


介绍

选择排序是一种简单直观的排序算法。它的基本思想是每次从未排序的部分中找到最小的元素,将其放到已排序部分的末尾。选择排序的时间复杂度也是 O(n²)。



动图演示

选择排序动图



代码示例


public static int[] SelectSort(int[] arr)
{
for (int i = 0; i {
int minIndex = i;
for (int j = i + 1; j {
if (arr[j] {
minIndex = j;
}
}
if (minIndex != i)
{
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
return arr;
}


插入排序


介绍

插入排序是一种简单直观的排序算法,其基本思想是将每个待排序的元素插入到已排序部分的适当位置。插入排序的时间复杂度也是 O(n²)。



动图演示

插入排序动图



代码示例


public static int[] InsertSort(int[] arr)
{
for (int i = 1; i {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key)
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
return arr;
}


希尔排序


介绍

希尔排序是插入排序的一种改进版本,通过引入增量序列来减少元素之间的比较次数。希尔排序的时间复杂度通常优于 O(n²),但具体取决于增量序列的选择。



动图演示

希尔排序动图



代码示例


public static int[] ShellSort(int[] arr)
{
int n = arr.Length;
for (int gap = n / 2; gap > 0; gap /= 2)
{
for (int i = gap; i {
int temp = arr[i];
int j = i;
while (j >= gap && arr[j - gap] > temp)
{
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp;
}
}
return arr;
}


快速排序


介绍

快速排序是一种高效的排序算法,其基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序。快速排序的平均时间复杂度为 O(n log n)。



动图演示

快速排序动图



代码示例


public static int[] QuickSort(int[] arr)
{
return QuickSortRecursive(arr, 0, arr.Length - 1);
}

private static int[] QuickSortRecursive(int[] arr, int low, int high)
{
if (low {
int pi = Partition(arr, low, high);
QuickSortRecursive(arr, low, pi - 1);
QuickSortRecursive(arr, pi + 1, high);
}
return arr;
}

private static int Partition(int[] arr, int low, int high)
{
int pivot = arr[high];
int i = low - 1;
for (int j = low; j {
if (arr[j] <= pivot)
{
i++;
Swap(arr, i, j);
}
}
Swap(arr, i + 1, high);
return i + 1;
}

private static void Swap(int[] arr, int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}


参考资料:博客园 - 常见排序算法详解博客园 - 排序算法总结


推荐阅读
  • 本文介绍如何在C#中利用Parallel类实现高效的多线程处理。自.NET Framework 4.0起引入的Parallel类,提供了强大的并行编程工具,包括并行的for和foreach循环,以及并行调用多个方法的功能。 ... [详细]
  • C#反射reflection
    C#shanzm目录简介引入1.新建类库2.类库的使用3.反射反射实例1反射实例2反射实例3简介反射(reflection)是什么?在《精通C#》中是这么说的“反射就是一个运行库发 ... [详细]
  • 本文探讨了Java和C#中可变参数的使用规则及示例代码,重点介绍了两种语言中实现可变参数的不同方式及其限制条件。 ... [详细]
  • linq操作符:分组操作符
    分组是根据一个特定的值将序列中的元素进行分组。LINQ只包含一个分组操作符:GroupBy。GroupBy操作符类似于T-SQL语言中的GroupBy语句。来看看GroupBy的方 ... [详细]
  • C# WPF 打字射击游戏开发
    介绍了一个基于C#和WPF技术的简单打字射击游戏的实现方法,包括字母的生成、移动、消除以及基本的游戏界面设计。 ... [详细]
  • 本文探讨了在C#服务中捕获控制台输出的有效方法,特别是在远程系统部署的应用场景下。文中不仅提供了基础的解决方案,还深入讨论了最佳实践,如使用日志库和事件日志等。 ... [详细]
  • 本文介绍了一种算法,用于从一个整数的末尾获取第 K 位数字。如果该位置不存在,则返回 -1。 ... [详细]
  • 探讨了当类没有默认构造函数时,如何使用特定参数创建多个对象的方法。本文提供了多种解决方案,包括使用指针数组和标准库容器。 ... [详细]
  • 本文提供了一套实用的方法论,旨在帮助开发者构建能够应对高并发请求且易于扩展的Web服务。内容涵盖了服务器架构、数据库管理、缓存策略以及异步处理等多个方面。 ... [详细]
  • 本文详细介绍了如何通过修改Lua源码或使用动态链接库(DLL)的方式实现Lua与C++之间的高级交互,包括如何编译Lua源码、添加自定义API以及在C++中加载和调用Lua脚本。 ... [详细]
  • 本文详细探讨了如何在 SparkSQL 中创建 DataFrame,涵盖了从基本概念到具体实践的各种方法。作为持续学习的一部分,本文将持续更新以提供最新信息。 ... [详细]
  • 01背包问题是算法领域中常见的优化问题之一,本文旨在回顾并详细解析其核心——状态转移方程的构建方法。通过设定物品数量、单个物品的重量与价值以及背包的最大承重,利用二维数组表示可能的最大收益,进而探讨如何通过状态转移方程实现最优解。 ... [详细]
  • 3152 数值选取挑战
    本问题描述了一个数值选取游戏,玩家需要从给定的一系列正整数中选择一半数量的数字,目标是使这些数字的最大公约数(GCD)尽可能大。任务是计算并返回可能的最大GCD值。 ... [详细]
  • 本文通过C语言实现了一个基于随机选择枢轴的快速排序算法,并详细解释了其工作原理和代码实现细节。 ... [详细]
  • 本文详细探讨了Laravel框架中的数据库操作,包括读写分离、事务处理、Eloquent ORM的使用、关联关系管理及性能优化技巧。 ... [详细]
author-avatar
诚实宝贝2002
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有