在C#中,排序是数据处理中常见的操作。C# 提供了多种排序方式,从简单的冒泡排序到高效的内置排序算法,开发者可以根据不同的场景和需求选择适合的排序方法。本文将介绍C#中常用的几种排序方式,包括它们的工作原理、性能特点以及适用场景。
冒泡排序(Bubble Sort)
冒泡排序是一种简单的排序算法,通过重复地遍历待排序的序列,比较每对相邻的元素,如果它们的顺序错误就交换位置,直到没有元素需要交换为止。
publicstaticvoidBubbleSort(int[] array)
{
int n = array.Length;
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if (array[j] > array[j + 1])
{
// 交换元素
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
冒泡排序的时间复杂度为O(n^2),因此它不适合处理大规模数据。但由于其实现简单,经常作为教学示例。
选择排序(Selection Sort)
选择排序也是一种简单的排序算法,它的工作原理是每次从未排序的部分中选择最小(或最大)的元素,存放到排序序列的起始位置,直到所有元素均排序完毕。
publicstaticvoidSelectionSort(int[] array)
{
int n = array.Length;
for (int i = 0; i < n - 1; i++)
{
int minIndex = i;
for (int j = i + 1; j < n; j++)
{
if (array[j] < array[minIndex])
{
minIndex = j;
}
}
// 交换找到的最小元素与第一个未排序的元素
int temp = array[minIndex];
array[minIndex] = array[i];
array[i] = temp;
}
}
选择排序的时间复杂度同样为O(n^2),效率不高,但在某些特定场景(如小规模数据或需要稳定排序时)中可能更适用。
插入排序(Insertion Sort)
插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
publicstaticvoidInsertionSort(int[] array)
{
int n = array.Length;
for (int i = 1; i < n; i++)
{
int key = array[i];
int j = i - 1;
while (j >= 0 && array[j] > key)
{
array[j + 1] = array[j];
j = j - 1;
}
array[j + 1] = key;
}
}
插入排序的时间复杂度在最好情况下为O(n),平均和最坏情况下为O(n^2)。它在小规模数据或数据几乎已经有序时表现良好。
快速排序(Quick Sort)
快速排序是一种高效的排序算法,它采用分治的思想,通过选择一个基准元素将数组分为两个子数组,一个包含比基准小的元素,另一个包含比基准大的元素,然后对这两个子数组进行递归排序。
publicstaticvoidQuickSort(int[] array, int low, int high)
{
if (low < high)
{
int pi = Partition(array, low, high);
QuickSort(array, low, pi - 1);
QuickSort(array, pi + 1, high);
}
}
privatestaticintPartition(int[] array, int low, int high)
{
int pivot = array[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++)
{
if (array[j] < pivot)
{
i++;
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
int temp = array[i + 1];
array[