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方法还是先前的那个不变。
像合并排序一样,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方法还是先前的那个不变。
相关文章推荐
- 算法导论:快速排序及其随机化版本
- 算法设计之快速排序的随机化版本 (C++实现)
- C语言的发展及其版本
- 编译GCC及其多版本并存控制
- 脚本检查浏览器及其版本
- PHP5.2 以上版本及其 IIS 与 Apache2.2 的共存问题
- 算法导论7.3快速排序的随机化版本
- 快速排序分析与随机化算法+快速排序的随机化版本
- Delphi7及其以下版本的 VCL 只支持 Ansi, 所以... WideString 与 UTF8String (定义与 AnsiString 相同) 并没有办法正确的在 VCL 中显示 Del
- Git 系列之一:版本控制的概念、分布式、Git 简介及其工作流程
- 检测浏览器是否安装了flash及其版本
- C语言的发展及其版本
- 版本管理工具Git相关知识及其注意事项
- 如何确定 SQL Server 及其组件的版本
- 在CentOS7上安装Python3.5.0,及其与旧版本Python2.7.5的共存问题笔记
- 查看sqlserver版本及其补丁
- S60,UIQ机型及其对应的系统版本清单
- 30 查看当前Linux系统中安装的shell及其版本
- server2008 及其以上版本防火墙设置
- JQuery 判断浏览器及其版本