C# 排序算法 快速排序
使用环境 vs2017 .net core 2.1 控制台程序
实现方式:快速排序是一种高效排序。它包含了“分而治之”以及“标兵”的思想。从数组中挑选一个数(一般为第一个数据)作为“标兵”,使比它小的放在它的左侧,比它大的放在它的右侧。
以【65】为标兵,定义变量保存,0位置为待处理位置,从right向前找直到找到比标兵小的,将其放入到待处理位置,left++,并设置当前为待处理位置,从left开始向后找比标兵大的放入待处理位置,right–,并设置当前为待处理位置。直到left>right结束,此时第一个标兵位置确定。并以标兵为点,将数组分为两段分别继续递归实现该方法。
// 记录外部循环次数
public static int outListInt { get; set; }
// 记录内部循环次数
public static int inListInt { get; set; }
// 记录排序次数
public static int sortListInt{ get; set; }
static void Main(string[] args)
{
Console.WriteLine("快速排序-示例");
// 初始化 list 无序列表
List<int> baseIntList = new List<int>()
{
65, 1, 5, 2, 7, 11, 2, 4, 3
};
//
FastSort(baseIntList, 0, baseIntList.Count - 1);
Console.WriteLine();
//
Console.WriteLine("外部循环次数:" + outListInt);
Console.WriteLine("内部循环次数:" + inListInt);
Console.WriteLine("排 序 次 数:" + sortListInt);
//
OutputResult("输出结果", baseIntList);
Console.ReadKey();
}
private static void FastSort(List<int> baseIntList, int left, int right)
{
if (left >= right) return;
int x = baseIntList[left];
int i = left;
int j = right;
try
{
while (i < j)
{
outListInt += 1;
while (i < j && baseIntList[j] >= x)
{
j--;
sortListInt += 1;
}
if (i == j) break;
// 输出
OutputResult("移动之前", baseIntList);
Console.Write(String.Format(" {0}<-移动到->{1} ", j, i));
baseIntList[i++] = baseIntList[j];
// 输出
OutputResult("移动之后", baseIntList);
Console.WriteLine();
while (i < j && baseIntList[i] <= x)
{
i++;
sortListInt += 1;
}
if (i == j) break;
// 输出
OutputResult("移动之前", baseIntList);
Console.Write(String.Format(" {0}<-移动到->{1} ", i, j));
baseIntList[j--] = baseIntList[i];
// 输出
OutputResult("移动之后", baseIntList);
Console.WriteLine();
}
// 输出
OutputResult("移动之前", baseIntList);
Console.Write(String.Format(" 数据{0}<-移动到->{1} 数据区间{2}--{3} ", x, i, left, right));
baseIntList[i] = x;
// 输出
OutputResult("移动之后", baseIntList);
Console.WriteLine();
FastSort(baseIntList, left, i - 1);
FastSort(baseIntList, i + 1, right);
//
inListInt += 1;
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
/// <summary>
/// 格式化输出
/// </summary>
/// <param name="outputString">输出标题</param>
/// <param name="baseIntLsit">输出内容</param>
private static void OutputResult(string outputString, List<int> baseIntLsit)
{
Console.Write(outputString + ":");
foreach (int itemInt in baseIntLsit)
{
Console.Write(itemInt + " ");
}
}