常见排序算法解析C#
Posted 李公子lm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常见排序算法解析C#相关的知识,希望对你有一定的参考价值。
冒泡排序
介绍
冒泡排序的思想是两两比较,两两交换,假设从左到右数据是依次增大的,首先比较元素1和2,若1比2大,则交换位置,继续比较元素2和3,就这样一直比较下去,就可以把最大的值放到最右边,直到所有的数据比较移动完成,则排序完成。平均时间复杂度为O(n^2)
动图演示
代码
public static int[] BubbleSort(int[] arr)
{
int temp;
for (int i = 0; i < arr.Length-1; i++)
{
for (int j = 1; j < arr.Length-i-1; j++)
{
if (arr[j - 1] > arr[j])
{
temp = arr[j - 1];
arr[j - 1] = arr[i];
arr[i] = temp;
}
}
}
return arr;
}
选择排序
介绍
选择排序为冒泡排序的升级版,该排序算法可以理解为找最小值,首先以第1个元素为基准,比较剩下所有的元素,若比第1个元素还小,则更新最小值,所有元素找完之后,把最小值和排好元素右边的值交换位置,接着在剩下的元素中继续找最小值,放到第1个元素的右边,如此找完之后,则排序完成。时间复杂度为O(n^2)
动图演示
代码
public static int[] SelectSort(int[] arr)
{
int min;
for (int i = 0; i < arr.Length - 1; i++)
{
min = i;
for (int j = i + 1; j < arr.Length; j++)
{
if (arr[j] < arr[min])
min = j;
}
int t = arr[min];
arr[min] = arr[i];
arr[i] = t;
}
return arr;
}
插入排序
介绍
可以用打牌的方式简单理解插入排序,假设我买首先拿到一张10,然后拿到一张5,正常情况下,我们会把5放到10的左边,接着拿到一张7,则会把7放到5和10的中间,这就是插入排序,首先以最左边第1个元素为基准,用第2个元素和第1个元素比较,若比第1个元素小,则放到第1个元素的左边,接着拿第3个元素和第2个元素比较,若比第2个元素小,则继续和第1个元素比较,比第1个元素大,比第2个元素小,则放到1和2中间的位置,如此比较整个序列,序列比较完成,则排序完成,时间复杂度为O(n^2)
动图演示
代码
public static int[] InsertSort(int[] arr)
{
for (int i = 1; i < arr.Length; i++)
{
int t = arr[i];
int j = i;
while ((j > 0) && (arr[j - 1] > t))
{
arr[j] = arr[j - 1];
--j;
}
arr[j] = t;
}
return arr;
}
希尔排序
介绍
1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述:
- 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
- 按增量序列个数k,对序列进行k 趟排序;
- 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
动图演示
代码
public static int[] ShellSort(int[] arr)
{
int inc;
for (inc = 1; inc <= arr.Length / 9; inc = 3 * inc + 1) ;
for (; inc > 0; inc /= 3)
{
for (int i = inc + 1; i <= arr.Length; i += inc)
{
int t = arr[i - 1];
int j = i;
while ((j > inc) && (arr[j - inc - 1] > t))
{
arr[j - 1] = arr[j - inc - 1];
j -= inc;
}
arr[j - 1] = t;
}
}
return arr;
}
其他代码
static void Main(string[] args)
{
var arr = new int[10];
//生成10-100的随机数
for (int i = 0; i < 10; i++)
{
arr[i] = new Random().Next(10, 100);
}
Console.WriteLine("原始数组");
foreach (var item in arr)
{
Console.Write(item+",");
}
var newArr = ShellSort(arr);
Console.WriteLine("\\n");
Console.WriteLine("排序后数组");
foreach (var item in newArr)
{
Console.Write(item+",");
}
Console.ReadKey();
}
快速排序
介绍
快速排序的核心思想是找基准元素,首先以第一个元素为基准元素,则进行一轮排序之后,所有比该基准元素大的都在右边,比基准元素小的都在左边,然后对左边和右边分别在去基准进行分割排序,直至所有元素排序完成。
动图演示
代码
public static int[] QuickSort(int[] arr)
{
return QuickSortStrict(arr, 0, arr.Length - 1);
}
public static int[] QuickSortStrict(int[] data, int low, int high)
{
if (low >= high) return data;
int temp = data[low];
int i = low + 1, j = high;
while (true)
{
while (data[j] > temp) j--;
while (data[i] < temp && i < j) i++;
if (i >= j) break;
Swap(data, i, j);
i++; j--;
}
if (j != low)
Swap(data, low, j);
QuickSortStrict(data, j + 1, high);
QuickSortStrict(data, low, j - 1);
return data;
}
//交换
public static void Swap(int[] data,int a, int b)
{
int temp = data[a];
data[a] = data[b];
data[b] = temp;
}
参考资料:https://www.cnblogs.com/onepixel/articles/7674659.html
https://www.cnblogs.com/cuojue/p/10634228.html
以上是关于常见排序算法解析C#的主要内容,如果未能解决你的问题,请参考以下文章