快速排序(有时称为分区交换排序)是一种有效的排序算法。由英国计算机科学家Tony Hoare于1959年开发并于1961年发表,它是一种常用的排序算法。如果运用得当,它可以比主要竞争对手(合并排序和堆排序)快两到三倍。
QuickSort是一种分治(divide-and-conquer)算法。它通过从数组中选择一个“基准数”(pivot)元素并将其他元素划分为两个子数组(根据它们是否小于或大于基准数),然后将子数组递归排序,直至排序完成,过程需要少量额外的内存来执行排序。
快速排序是一种比较排序,这意味着它可以对定义了“小于”(less-than)关系的任何类型的项目进行排序。快速排序不是稳定的排序,这意味着不会保留相等排序项的相对顺序。
快速排序的数学分析表明,平均而言,该算法排序 n 个项目要Ο(nlog n)次比较。在最坏的情况下,它会进行O(n²)次比较,尽管这种情况很少见。
![](https://i-blog.csdnimg.cn/blog_migrate/cfd7f6b6f3ad0ada7a511f9ced614f1c.png)
C#代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Quick_Sort
{
class Program
{
private static void Quick_Sort(int[] arr, int left, int right)
{
if (left < right)
{
int pivot = Partition(arr, left, right);
if (pivot > 1) {
Quick_Sort(arr, left, pivot - 1);
}
if (pivot + 1 < right) {
Quick_Sort(arr, pivot + 1, right);
}
}
}
private static int Partition(int[] arr, int left, int right)
{
int pivot = arr[left];
while (true)
{
while (arr[left] < pivot)
{
left++;
}
while (arr[right] > pivot)
{
right--;
}
if (left < right)
{
if (arr[left] == arr[right]) return right;
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
else
{
return right;
}
}
}
static void Main(string[] args)
{
int[] arr = new int[] { 3, 5, -8, 14, 1, 19, 25, 57, 41, 6 };
Console.WriteLine("Original array : ");
foreach (var item in arr)
{
Console.Write(" " + item);
}
Console.WriteLine();
Quick_Sort(arr, 0, arr.Length-1);
Console.WriteLine();
Console.WriteLine("Sorted array : ");
foreach (var item in arr)
{
Console.Write(" " + item);
}
Console.WriteLine();
}
}
}
输出结果:
Original array :
3, 5, -8, 14, 1, 19, 25, 57, 41, 6
Sorted array :
-8 1 3 5 6 14 19 25 41 57
流程图:
![](https://i-blog.csdnimg.cn/blog_migrate/fe6196cdfdd926a3979239d19965b1c3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4d1fc43a0e77cf0f5da604080d815850.png)
总结:
虽然快速排序速度很快,但是这是要考虑综合情况的,对于大规模的随机数列,它的排序时间能比同样是基于元素比较的归并排序还快,但是对于小规模数列,它的效率可能还不如插入排序,亦或是输入序列部分排序的话,它的表现也会不如插入排序。
原创文章,转载请添加【几行简码】微信公众号,阅读转载须知后进行。