您的位置:首页 > 编程语言 > C#

几种常见排序算法的C#实现

2018-03-04 10:46 281 查看

前言

不知道是不是我搜索能力欠缺,网上搜到的几种排序算法的C#实现,原理说的清楚,但是示例代码有些不友好,所以我自己写了几个示例,供以后参考使用。

本文没有动图展示,没有逐步剖析,也没有算法比较(网上可以搜到很多)。

本文默认数组排序目标是从小到大排列,示例的目标数组是[1, 6, 4, 8, 2, 5, 0]。

正文

1.冒泡排序

简单说明:从数组的首端(尾端)开始,将相邻两数进行比较,将最大(最小)的数放置到尾端(首端),如此循环,并在下次循环时剔除上次尾端(首端)已放置好的数,直至排出正确序列。

1.1从首端开始的冒泡排序

int temp;
for (int i = 0; i < list.Length - 1; i++)
{
for (int j = 1; j < list.Length - i - 1; j++)
{
if (list[j - 1] > list[j])
{
temp = list[j - 1];
list[j - 1] = list[j];
list[j] = temp;
}
}
}


1.2从尾端开始的冒泡排序

int temp;
for (int i = list.Length - 1; i > 0; i--)
{
for (int j = list.Length - 1; j > list.Length - 1 - i; j--)
{
if (list[j - 1] > list[j])
{
temp = list[j - 1];
list[j - 1] = list[j];
list[j] = temp;
}
}
}


2.选择排序

简单说明:从首端开始,利用中间变量找出最小的数将此数与首端数进行交换,下次循环找出最小数与第二个数进行交换,如此循环,直至正确排序。

int min, temp;
for (int i = 0; i < list.Length - 1; i++)
{
min = i;
for (int j = i + 1; j < list.Length - 1; j++)
{
if (list[min] > list[j])
{
min = j;
}
}
temp = list[i];
list[i] = list[min];
list[min] = temp;
}


3.插入排序

简单说明:从第二个数开始往右循环,每次循环中将当前数分别与其左边的数进行比较,如发现比当前数大的数则进行交换,如此循环,直至正确排序。

int temp;
for (int i = 1; i < list.Length; i++)
{
int j = i - 1;
temp = list[i];
//因为当前数的左边都已是排序好的数列,因此无需当前数与左边数列每个都进行比较,只要某个数比当前数小,则剩下未比较的数也一定比当前数小
while (j >= 0 && temp < list[j])
{
list[j + 1] = list[j];
j--;
}
list[j + 1] = temp;
}


4.快速排序

简单说明:选择数组中的一个数作为基准数(一般是第一个数),并设两个变量low,high用于记录索引值,然后从尾端开始向前逐个比较基准数,直至某个数比基准数小,则将该数索引存入high,将该数放置于low索引上,然后从首端开始向后逐个比较基准数,直至某个数比基准数大,则将该数索引存入low,将该数放置于high索引上,如此循环,直至low=high,将此时的low索引存入中间变量,将基准数存入该索引上,此时原数组被分为了两边,左边小,右边大,然后分组进行上述操作,如此循环,直至正确排序。

4.1 快速排序的非递归实现

Stack<int> s = new Stack<int>();
s.Push(0);
s.Push(list.Length - 1);
while (s.Count > 1)
{
int high = s.Pop();
int low = s.Pop();
int H = high;
int L = low;
int temp = list[low];

while (low < high)
{
while (low < high && temp <= list[high])
{
high--;
}
if (low < high)
{
list[low] = list[high];
//list[high] = temp;
}

while (low < high && temp >= list[low])
{
low++;
}
if (low < high)
{
list[high] = list[low];
//list[low] = temp;
}
}
list[low] = temp;
if (low == high)
{
if (L < low - 1)
{
s.Push(L);
s.Push(low - 1);
}
if (H > low + 1)
{
s.Push(low + 1);
s.Push(H);
}
}
}


4.2快速排序的递归实现

QuickSort(list,0,list.Length - 1);
private static void QuickSort(int[] list,int low,int high)
{
int mid;
if (low < high)
{
mid = Partition(list, low, high);
QuickSort(list,low,mid - 1);
QuickSort(list,mid + 1,high);
}
}

private static int Partition(int[] list,int low,int high)
{
int temp = list[low];
while (low < high)
{
while (low<high && temp < list[high])
{
high--;
}
list[low] = list[high];
while (low < high && temp > list[low])
{
low++;
}
list[high] = list[low];
}
list[low] = temp;
return low;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C# Sort Algorithm