您的位置:首页 > 产品设计 > UI/UE

Quick sort 及其随机化版本

2010-10-23 18:57 232 查看
Quick sort是一种排序算法,对n个数进行排序,最坏的情况是n的2次方。虽然这个是最坏运行时间比较差,但快速排序通常是用于排序的最佳的实用选择,这是因为quick sort平均性能相当好,期望的运行时间为nlgn。另外,quick sort 能够进行就地排序,在虚拟的坏境中也能很好的工作。

像合并排序一样,quick sort 也是基于分治模式的。用c#语言实现的quick sort 代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ArithmeticLibrary

{

public class QuickSortArithmetic

{

public QuickSortArithmetic()

{ }

public void QuickSort(Int32[] a, Int32 begin, Int32 end)

{

Int32 q = -1;

if (begin < end)

{

q = Partition(a,begin,end);

QuickSort(a, begin, q - 1);

QuickSort(a, q + 1, end);

}

}

private int Partition(int[] a, int begin, int end)

{

Int32 x = a[end];

Int32 i = begin - 1;

for (Int32 j = begin; j <= end - 1; j++)

{

if (a[j] <= x)

{

i++;

Int32 temp = a[j];

a[j] = a[i];

a[i] = temp;

}

}

Int32 t = a[i + 1];

a[i + 1] = a[end];

a[end] = t;

return i + 1;

}

}

}

具体的调用如下:

Int32[] a = new Int32[12] { 13,19,9,5,12,8,7,4,21,2,6,11};

Console.WriteLine("Begin Sort:");

foreach (Int32 item in a)

{

Console.Write(item.ToString()+" ");

}

QuickSortArithmetic quickSort = new QuickSortArithmetic();

quickSort.QuickSort(a, 0, a.Length-1);

Console.WriteLine("After Sort:");

foreach (Int32 item in a)

{

Console.Write(item.ToString() + " ");

}

从上面介绍quick sort排序可以看出,其实对数组a中间的子数组进行排序。例如,对a[5,10]之间的元素进行quick sort。

下面介绍快速排序的随机化的版本

在quick sort排序的随机化版本中,我们不是实用采用a[end]作为主元,而是从子数组a[begin,end]中随机的选择一个元素,既将a[end]与a[begin,end]中随机选出的一个元素交换。

对Partition和QuickSort 所作的改动比较小。增加了一个RandomizedPartition的方法,具体的c#代码如下:

private Int32 RandomizedPartition(Int32[] a, Int32 begin, Int32 end)

{

Random rand=new Random();

Int32 i = rand.Next(begin, end + 1);

Int32 temp = a[end];

a[end] = a[i];

a[i] = temp;

return Partition(a, begin, end);

}

QuickSort方法如下:

public void QuickSort(Int32[] a, Int32 begin, Int32 end)

{

Int32 q = -1;

if (begin < end)

{

q = RandomizedPartition(a, begin, end);

QuickSort(a, begin, q - 1);

QuickSort(a, q + 1, end);

}

}

而Partition方法还是先前的那个不变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: