• C#经典十大排序算法(完结)


    C#冒泡排序算法

    简介

    冒泡排序算法是一种基础的排序算法,它的实现原理比较简单。核心思想是通过相邻元素的比较和交换来将最大(或最小)的元素逐步"冒泡"到数列的末尾。

    详细文章描述

    https://mp.weixin.qq.com/s/z_LPZ6QUFNJcwaEw_H5qbQ

    代码实现

    1.         /// <summary>
    2.         /// 递归方式实现冒泡排序
    3.         /// </summary>
    4.         /// <param name="arr">arr</param>
    5.         /// <param name="arrLength">arrLength</param>
    6.         public static void RecursiveBubbleSort(int[] arr, int arrLength)
    7.         {
    8.             if (arrLength == 1)
    9.                 return;
    10.             for (int i = 0; i < arrLength - 1; i++)
    11.             {
    12.                 if (arr[i] > arr[i + 1])
    13.                 {
    14.                     //交换arr[i]和arr[i+1]的值
    15.                     int temp = arr[i];
    16.                     arr[i] = arr[i + 1];
    17.                     arr[i + 1= temp;
    18.                 }
    19.             }
    20.             RecursiveBubbleSort(arr, arrLength - 1);
    21.         }
    22.         public static void RecursiveBubbleSortRun()
    23.         {
    24.             int[] arr = { 189562347 };
    25.             int arrLength = arr.Length;
    26.             RecursiveBubbleSort(arr, arrLength);
    27.             Console.WriteLine("排序后结果:" + string.Join(", ", arr));
    28.         }

    C#选择排序算法

    简介

    选择排序算法的基本思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。

    详细文章描述

    https://mp.weixin.qq.com/s/B1QdqyP8HQgOv8tlSujtog

    代码实现

    1.         /// <summary>
    2.         /// 选择排序算法
    3.         /// </summary>
    4.         public static void SelectionSortAlgorithmMain()
    5.         {
    6.             int[] array = { 6425122211993100 };
    7.             Console.WriteLine("原始数组: ");
    8.             PrintArray(array);
    9.             SelectionSortAlgorithm(array);
    10.             Console.WriteLine("排序后的数组: ");
    11.             PrintArray(array);
    12.         }
    13.         static void SelectionSortAlgorithm(int[] arr)
    14.         {
    15.             int n = arr.Length;
    16.             for (int i = 0; i < n - 1; i++)
    17.             {
    18.                 // 在未排序部分中找到最小元素的索引
    19.                 int minIndex = i;
    20.                 for (int j = i + 1; j < n; j++)
    21.                 {
    22.                     if (arr[j] < arr[minIndex])
    23.                     {
    24.                         minIndex = j;
    25.                     }
    26.                 }
    27.                 // 将最小元素与未排序部分的第一个元素交换位置
    28.                 int temp = arr[minIndex];
    29.                 arr[minIndex] = arr[i];
    30.                 arr[i] = temp;
    31.             }
    32.         }
    33.         static void PrintArray(int[] arr)
    34.         {
    35.             int n = arr.Length;
    36.             for (int i = 0; i < n; ++i)
    37.             {
    38.                 Console.Write(arr[i] + " ");
    39.             }
    40.             Console.WriteLine();
    41.         }

    C#插入排序算法

    简介

    插入排序算法是一种简单、直观的排序算法,其原理是将一个待排序的元素逐个地插入到已经排好序的部分中。

    详细文章描述

    https://mp.weixin.qq.com/s/YEregZ_GOGgEltGUJadycw

    代码实现

    1.  public static void InsertionSort(int[] array)
    2.         {
    3.             int arrayLength = array.Length;//数组长度(时间复杂度为O(n^2))
    4.             for (int i = 1; i < arrayLength; ++i)
    5.             {
    6.                 //定义临时变量
    7.                 int temp = array[i];
    8.                 int j = i - 1;
    9.                 while (j >= 0 && array[j] > temp)
    10.                 {
    11.                     array[j + 1= array[j];
    12.                     j--;
    13.                 }
    14.                 array[j + 1= temp;
    15.             }
    16.         }
    17.         public static void InsertionSortRun()
    18.         {
    19.             int[] array = { 26155338364427472464501948 };
    20.             Console.WriteLine("排序前:" + string.Join(", ", array));
    21.             InsertionSort(array);
    22.             Console.WriteLine("排序后:" + string.Join(", ", array));
    23.         }

    C#希尔排序算法

    简介

    希尔排序简单的来说就是一种改进的插入排序算法,它通过将待排序的元素分成若干个子序列,然后对每个子序列进行插入排序,最终逐步缩小子序列的间隔,直到整个序列变得有序。希尔排序的主要思想是通过插入排序的优势,减小逆序对的距离,从而提高排序效率。

    详细文章描述

    https://mp.weixin.qq.com/s/_t9QVuj_rLcNomyv7LcGMA

    代码实现

    1. public static void ShellSort(int[] array)
    2.         {
    3.             int arrLength = array.Length;
    4.             // 初始化增量(初始间隔)为数组长度的一半
    5.             int gap = arrLength / 2;
    6.             // 不断缩小增量,直到增量为1
    7.             while (gap > 0)
    8.             {
    9.                 // 对每个子序列进行插入排序
    10.                 for (int i = gap; i < arrLength; i++)
    11.                 {
    12.                     int temp = array[i];
    13.                     int j = i;
    14.                     // 在子序列内部进行插入排序
    15.                     while (j >= gap && array[j - gap] > temp)
    16.                     {
    17.                         array[j] = array[j - gap];
    18.                         j -= gap;
    19.                     }
    20.                     array[j] = temp;
    21.                 }
    22.                 // 缩小增量
    23.                 gap /= 2;
    24.             }
    25.         }
    26.         public static void ShellSortRun()
    27.         {
    28.             int[] array = { 192022323450994911111553593967170387848 };
    29.             Console.WriteLine("排序前数组:" + string.Join(", ", array));
    30.             ShellSort(array);
    31.             Console.WriteLine("排序后数组:" + string.Join(", ", array));
    32.         }

    C#归并排序算法

    简介

    归并排序是一种常见的排序算法,它采用分治法的思想,在排序过程中不断将待排序序列分割成更小的子序列,直到每个子序列中只剩下一个元素,然后将这些子序列两两合并排序,最终得到一个有序的序列。

    详细文章描述

    https://mp.weixin.qq.com/s/ToURWBfVIl7087Ago8fGdQ

    代码实现

    1.   public static void MergeSort(int[] arr, int left, int right)
    2.         {
    3.             if (left < right)
    4.             {
    5.                 // 计算中间索引
    6.                 int mid = (left + right/ 2;
    7.                 // 对左半部分数组进行归并排序
    8.                 MergeSort(arr, left, mid);
    9.                 // 对右半部分数组进行归并排序
    10.                 MergeSort(arr, mid + 1right);
    11.                 // 合并两个有序数组
    12.                 Merge(arr, left, mid, right);
    13.             }
    14.         }
    15.         public static void Merge(int[] arr, int left, int mid, int right)
    16.         {
    17.             int n1 = mid - left + 1// 左半部分数组的长度
    18.             int n2 = right - mid;    // 右半部分数组的长度
    19.             // 创建临时数组
    20.             int[] leftArr = new int[n1];
    21.             int[] rightArr = new int[n2];
    22.             // 将数据拷贝到临时数组
    23.             for (int i = 0; i < n1++i)
    24.             {
    25.                 leftArr[i] = arr[left + i];
    26.             }
    27.             for (int j = 0; j < n2++j)
    28.             {
    29.                 rightArr[j] = arr[mid + 1 + j];
    30.             }
    31.             // 合并两个有序数组
    32.             int k = left;   // 初始化合并后的数组索引
    33.             int p = 0;      // 初始化左半部分数组的索引
    34.             int q = 0;      // 初始化右半部分数组的索引
    35.             while (p < n1 && q < n2)
    36.             {
    37.                 if (leftArr[p] <= rightArr[q])
    38.                 {
    39.                     arr[k] = leftArr[p];
    40.                     p++;
    41.                 }
    42.                 else
    43.                 {
    44.                     arr[k] = rightArr[q];
    45.                     q++;
    46.                 }
    47.                 k++;
    48.             }
    49.             // 复制左半部分数组的剩余元素
    50.             while (p < n1)
    51.             {
    52.                 arr[k] = leftArr[p];
    53.                 p++;
    54.                 k++;
    55.             }
    56.             // 复制右半部分数组的剩余元素
    57.             while (q < n2)
    58.             {
    59.                 arr[k] = rightArr[q];
    60.                 q++;
    61.                 k++;
    62.             }
    63.         }
    64.         public static void MergeSortRun()
    65.         {
    66.             int[] array = { 19274648502444473638152653 };
    67.             Console.WriteLine("排序前数组:" + string.Join(", ", array));
    68.             MergeSort(array, 0, array.Length - 1);
    69.             Console.WriteLine("排序后数组:" + string.Join(", ", array));
    70.         }   

    C#快速排序算法

    简介

    快速排序是一种常用的排序算法,它基于分治的思想,通过将一个无序的序列分割成两个子序列,并递归地对子序列进行排序,最终完成整个序列的排序。

    详细文章描述

    https://mp.weixin.qq.com/s/7vms2Q4s7DBdFs31w4cfVA

    代码实现

    1.  public class 快速排序算法
    2.     {
    3.         public static void Sort(int[] array, int low, int high)
    4.         {
    5.             if (low < high)
    6.             {
    7.                 //将数组分割为两部分,并返回分割点的索引
    8.                 int pivotIndex = Partition(array, low, high);
    9.                 //递归对分割后的两部分进行排序
    10.                 Sort(array, low, pivotIndex - 1);
    11.                 Sort(array, pivotIndex + 1, high);
    12.             }
    13.         }
    14.         private static int Partition(int[] array, int low, int high)
    15.         {
    16.             //选择最后一个元素作为基准元素
    17.             int pivot = array[high];
    18.             int i = low - 1;
    19.             for (int j = low; j <= high - 1; j++)
    20.             {
    21.                 //如果当前元素小于等于基准元素,则将它与i+1位置的元素交换
    22.                 if (array[j] <= pivot)
    23.                 {
    24.                     i++;
    25.                     Swap(array, i, j);
    26.                 }
    27.             }
    28.             //将基准元素放置到正确的位置上
    29.             Swap(array, i + 1, high);
    30.             return i + 1//返回基准元素的索引
    31.         }
    32.         private static void Swap(int[] array, int i, int j)
    33.         {
    34.             int temp = array[i];
    35.             array[i] = array[j];
    36.             array[j] = temp;
    37.         }
    38.         public static void QuickSortRun()
    39.         {
    40.             int[] array = { 23538191526273644474650484 };
    41.             Sort(array, 0, array.Length - 1);
    42.             Console.WriteLine("排序后结果:" + string.Join(", ", array));
    43.         }
    44.     }

    C#堆排序算法

    简介

    堆排序是一种高效的排序算法,基于二叉堆数据结构实现。它具有稳定性、时间复杂度为O(nlogn)和空间复杂度为O(1)的特点。

    详细文章描述

    https://mp.weixin.qq.com/s/zS_ESKzlg05ICqFPIaePkg

    代码实现

    1.  public static void HeapSort(int[] array)
    2.         {
    3.             int arrayLength = array.Length;
    4.             //构建最大堆
    5.             for (int i = arrayLength / 2 - 1; i >= 0; i--)
    6.                 Heapify(array, arrayLength, i);
    7.             //依次取出堆顶元素,并重新调整堆
    8.             for (int i = arrayLength - 1; i >= 0; i--)
    9.             {
    10.                 //将堆顶元素与当前最后一个元素交换
    11.                 int temp = array[0];
    12.                 array[0= array[i];
    13.                 array[i] = temp;
    14.                 //重新调整堆
    15.                 Heapify(array, i, 0);
    16.             }
    17.         }
    18.         private static void Heapify(int[] arr, int n, int i)
    19.         {
    20.             int largest = i; //假设父节点最大
    21.             int left = 2 * i + 1//左子节点
    22.             int right = 2 * i + 2//右子节点
    23.             //如果左子节点大于父节点,则更新最大值
    24.             if (left < n && arr[left> arr[largest])
    25.                 largest = left;
    26.             //如果右子节点大于父节点和左子节点,则更新最大值
    27.             if (right < n && arr[right> arr[largest])
    28.                 largest = right;
    29.             //如果最大值不是当前父节点,则交换父节点和最大值,并继续向下调整堆
    30.             if (largest != i)
    31.             {
    32.                 int swap = arr[i];
    33.                 arr[i] = arr[largest];
    34.                 arr[largest] = swap;
    35.                 Heapify(arr, n, largest);
    36.             }
    37.         }
    38.         public static void HeapSortRun()
    39.         {
    40.             int[] array = { 19274648502444473638152653998880, -1 };
    41.             Console.WriteLine("排序前数组:" + string.Join(", ", array));
    42.             HeapSort(array);
    43.             Console.WriteLine("排序后数组:" + string.Join(", ", array));
    44.         }

    C#计数排序算法

    简介

    计数排序是一种非比较性的排序算法,适用于排序一定范围内的整数。它的基本思想是通过统计每个元素的出现次数,然后根据元素的大小依次输出排序结果。

    详细文章描述

    https://mp.weixin.qq.com/s/PA5NNqcy3CM9PSncWCsmEg

    代码实现

    1. public static void CountingSort(int[] array)
    2.         {
    3.             int arrayLength = array.Length;
    4.             if (arrayLength <= 1return;
    5.             int min = array[0];
    6.             int max = array[0];
    7.             //找出最大值和最小值
    8.             for (int i = 1; i < arrayLength; i++)
    9.             {
    10.                 if (array[i] < min) min = array[i];
    11.                 if (array[i] > max) max = array[i];
    12.             }
    13.             //统计每个元素出现的次数
    14.             int[] count = new int[max - min + 1];
    15.             //统计每个元素出现的次数
    16.             for (int i = 0; i < arrayLength; i++)
    17.             {
    18.                 count[array[i] - min]++;
    19.             }
    20.             //根据count数组和min值确定每个元素的起始位置
    21.             for (int i = 1; i < count.Length; i++)
    22.             {
    23.                 count[i] += count[i - 1];
    24.             }
    25.             //存储排序结果
    26.             int[] temp = new int[arrayLength];
    27.             //根据count数组和min值确定每个元素在temp数组中的位置
    28.             for (int i = arrayLength - 1; i >= 0; i--)
    29.             {
    30.                 int index = count[array[i] - min] - 1;
    31.                 temp[index= array[i];
    32.                 count[array[i] - min]--;
    33.             }
    34.             //将排序结果复制回原数组
    35.             for (int i = 0; i < arrayLength; i++)
    36.             {
    37.                 array[i] = temp[i];
    38.             }
    39.         }
    40.         public static void CountingSortRun()
    41.         {
    42.             int[] array = { 1927464850244447363815265399888};
    43.             Console.WriteLine("排序前数组:" + string.Join(", ", array));
    44.             CountingSort(array);
    45.             Console.WriteLine("排序后数组:" + string.Join(", ", array));
    46.         }

    C#桶排序算法

    简介

    桶排序是一种线性时间复杂度的排序算法,它将待排序的数据分到有限数量的桶中,每个桶再进行单独排序,最后将所有桶中的数据按顺序依次取出,即可得到排序结果。

    详细文章描述

    https://mp.weixin.qq.com/s/YzviDcm3-4E5Wf2jooylJQ

    代码实现

    1. public static void BucketSort(int[] array)
    2.         {
    3.             int arrLength = array.Length;
    4.             if (arrLength <= 1)
    5.             {
    6.                 return;
    7.             }
    8.             //确定桶的数量
    9.             int maxValue = array[0], minValue = array[0];
    10.             for (int i = 1; i < arrLength; i++)
    11.             {
    12.                 if (array[i] > maxValue)
    13.                     maxValue = array[i];
    14.                 if (array[i] < minValue)
    15.                     minValue = array[i];
    16.             }
    17.             int bucketCount = (maxValue - minValue) / arrLength + 1;
    18.             //创建桶并将数据放入桶中
    19.             List<List<int>> buckets = new List>(bucketCount);
    20.             for (int i = 0; i < bucketCount; i++)
    21.             {
    22.                 buckets.Add(new List<int>());
    23.             }
    24.             for (int i = 0; i < arrLength; i++)
    25.             {
    26.                 int bucketIndex = (array[i] - minValue) / arrLength;
    27.                 buckets[bucketIndex].Add(array[i]);
    28.             }
    29.             //对每个非空的桶进行排序
    30.             int index = 0;
    31.             for (int i = 0; i < bucketCount; i++)
    32.             {
    33.                 if (buckets[i].Count == 0)
    34.                 {
    35.                     continue;
    36.                 }
    37.                 int[] tempArr = buckets[i].ToArray();
    38.                 Array.Sort(tempArr);
    39.                 foreach (int num in tempArr)
    40.                 {
    41.                     array[index++= num;
    42.                 }
    43.             }
    44.         }
    45.         public static void BucketSortRun()
    46.         {
    47.             int[] array = { 1927464850244447363815265399888};
    48.             Console.WriteLine("排序前数组:" + string.Join(", ", array));
    49.             BucketSort(array);
    50.             Console.WriteLine("排序后数组:" + string.Join(", ", array));
    51.         }

    C#基数排序算法

    简介

    基数排序是一种非比较性排序算法,它通过将待排序的数据拆分成多个数字位进行排序。

    详细文章描述

    https://mp.weixin.qq.com/s/dCG-LLim4UGD1kIY2a3hmA

    代码实现

    1. public static void RadixSort(int[] array)
    2.         {
    3.             if (array == null || array.Length < 2)
    4.             {
    5.                 return;
    6.             }
    7.             //获取数组中的最大值,确定排序的位数
    8.             int max = GetMaxValue(array);
    9.             //进行基数排序
    10.             for (int exp = 1; max / exp > 0; exp *= 10)
    11.             {
    12.                 CountingSort(array, exp);
    13.             }
    14.         }
    15.         private static void CountingSort(int[] array, int exp)
    16.         {
    17.             int arrayLength = array.Length;
    18.             int[] output = new int[arrayLength];
    19.             int[] count = new int[10];
    20.             //统计每个桶中的元素个数
    21.             for (int i = 0; i < arrayLength; i++)
    22.             {
    23.                 count[(array[i] / exp) % 10]++;
    24.             }
    25.             //计算每个桶中最后一个元素的位置
    26.             for (int i = 1; i < 10; i++)
    27.             {
    28.                 count[i] += count[i - 1];
    29.             }
    30.             //从原数组中取出元素,放入到输出数组中
    31.             for (int i = arrayLength - 1; i >= 0; i--)
    32.             {
    33.                 output[count[(array[i] / exp) % 10] - 1= array[i];
    34.                 count[(array[i] / exp) % 10]--;
    35.             }
    36.             //将输出数组复制回原数组
    37.             for (int i = 0; i < arrayLength; i++)
    38.             {
    39.                 array[i] = output[i];
    40.             }
    41.         }
    42.         private static int GetMaxValue(int[] arr)
    43.         {
    44.             int max = arr[0];
    45.             for (int i = 1; i < arr.Length; i++)
    46.             {
    47.                 if (arr[i] > max)
    48.                 {
    49.                     max = arr[i];
    50.                 }
    51.             }
    52.             return max;
    53.         }
    54.         public static void RadixSortRun()
    55.         {
    56.             int[] array = { 1927464899888502444473638152653 };
    57.             Console.WriteLine("排序前数组:" + string.Join(", ", array));
    58.             RadixSort(array);
    59.             Console.WriteLine("排序后数组:" + string.Join(", ", array));
    60.         }
  • 相关阅读:
    多线程拷贝文件
    Maven中的小学问(版本问题、打包问题等)
    MySQL - limit 分页查询 (查询操作 五)
    设置meta description 为什么显示显示本网站使用第三方cookie和相关技术
    经典案例|使用Supabase解决可视化大屏项目的常见问题
    怎么制作精美的公众号文章?教你几招
    优思学院|精益管理涵盖哪些内容?
    微信小程序获取用户头像和昵称能力调整!新的代替方案!
    枚举算法的二分法
    如何使用Spring Security控制会话
  • 原文地址:https://blog.csdn.net/qq_37237487/article/details/133958330