php专区

 首页 > php专区 > PHP进阶 > 算法 > 快速排序里的学问:霍尔快排的实现

快速排序里的学问:霍尔快排的实现

分享到:
【字体:
导读:
         摘要:专题的前一篇讲了快速排序的始祖——霍尔快排,那么这里就简单地实现以下霍尔快排。补充说明下,快排的一个核心步骤是选取枢纽元,通常的做法是将第一个元素用作枢纽元,《算法导论》里的快排例子和Hoare快排都是这种枢纽元选择。排序的思路是,选定一个枢纽元,比枢纽元大的全部丢到右边,比枢纽元小的全部丢到左边。 ...

快速排序里的学问:霍尔快排的实现

专题的前一篇讲了快速排序的始祖——霍尔快排,那么这里就简单地实现一下霍尔快排。

补充说明下,快排的一个核心步骤是选取枢纽元,通常的做法是将第一个元素用作枢纽元,《算法导论》里的快排例子和Hoare快排都是这种枢纽元选择。先撇开效率不说,我们先看看Hoare快排的实现:

#include "stdio.h"
#include "math.h"
#include "stdlib.h"

int num = 10;

void PrintArray(int arr[])
{
    int i;
	for(i=0; i =枢纽
int Partition(int *arr, int beg, int end)
{
	int low = beg, high = end;
	//选定枢轴
	int sentinel = arr[beg];
	while(low =sentinel)
		{
            //printf("n    arr[%d](%d) >= sentinel(%d)", high, arr[high], sentinel);
		    --high;
		    //printf(". high自减为%d, 此时 arr[high] 为 %d", high, arr[high]);
		}
		arr[low] = arr[high];
		//printf("n    赋值-> arr[low](arr[%d]) = arr[high](arr[%d]) = %d", low, high, arr[low]);
		//printf("n    比sentinel(%d)小的都丢到左边", sentinel);
		//比枢纽大的交换到高端
		while(low  arr[high](arr[%d]) = arr[low](arr[%d]) = %d", high, low, arr[high]);
	}
	arr[low] = sentinel;

	printf("n排序过程:");
	PrintArray(arr);
	return low;
}

void QuickSort(int *arr, int beg, int end)
{
	if(beg 

程序运行结果为:

初始数组:80 16 97 6 12 92 31 52 54 89
排序过程: [ 54 16 52 6 12 31 ] 80 [ 92 97 89 ]
排序过程:[ 31 16 52 6 12 ] 54 [ 80 92 97 89 ]
排序过程:[ 12 16 6 ] 31 [ 52 54 80 92 97 89 ]
排序过程:[ 6 ] 12 [ 16 31 52 54 80 92 97 89 ])
排序过程:[ 6 12 16 31 52 54 80 89 ] 92 [ 97 ]
最后结果:6 12 16 31 52 54 80 89 92 97
Process returned 0 (0x0)   execution time : 0.384 s
Press any key to continue.

排序的思路是,选定一个枢纽元,比枢纽元大的全部丢到右边,比枢纽元小的全部丢到左边,可以看看下图:

对霍尔快排的思路清晰了吧?

前面提到了,《算法导论》里的快排例子和Hoare快排都是将第一个元素用作枢纽元的排序,当然也有其它选择法,后面会介绍到。

延伸阅读

此文章所在专题列表如下:

  1. 快速排序里的学问:从猜数字开始
  2. 快速排序里的学问:再看看称球问题
  3. 快速排序里的学问:信息熵
  4. 快速排序里的学问:快速排序的过程
  5. 快速排序里的学问:霍尔与快速排序
  6. 快速排序里的学问:霍尔快排的实现
  7. 快速排序里的学问:枢纽元选择与算法效率
  8. 快速排序里的学问:随机化快排

本文地址:http://www.nowamagic.net/librarys/veda/detail/2396,欢迎访问原出处。

快速排序里的学问:霍尔快排的实现
分享到:
快速排序里的学问:枢纽元选择与算法效率
快速排序里的学问:枢纽元选择与算法效率 选择首尾元素做枢纽元 通常的、没有经过充分考虑的选择是将第一个或最后一个元素用作枢纽元。选择第一个元素作为枢纽元的程序例子可以参考专题的前一篇《快速排序里的学问:霍尔快排的实现》,而选择最后一个元素用作枢纽元的程序例子则可以参考《快速排序里的学问:快速排...
快速排序里的学问:霍尔与快速排序
快速排序里的学问:霍尔与快速排序 上一篇介绍了排序的本质,还有实现了《算法导论》里的快速排序算法。但是快速排序的算法不是只有一个,我们要一次过把快速排序的好东西都挖掘出来。所以这篇文章,让我们对快速排序溯源,去了解快速排序算法的发明者。 霍尔(Hoare) 霍尔 (Sir Charles Antony Richard Hoare) ...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……