快速排序 霍尔

在这里插入图片描述


     // 按照基准值对array数组的 [begin, end]区间中的元素进行划分
 int keyi = PartSort(array, begin, end);
 
     // 划分成功后以keyi为边界形成了左右两部分 [begin, keyi-1] keyi [div+1, end]
     // 左部分都是比 keyi 位置上的值小的部分,右部分都是比 keyi 位置上的值大的部分。
     // 递归排左部分[begin, keyi-1]
 QuickSort(array, begin, keyi);
 
     // 递归排右部分[keyi+1, end]

 QuickSort(array, keyi+1, end);

// 单趟排序
//		1.霍尔法
int PartSort1(int* a, int left, int right)
{
	int keyi = left;                // 记录下 key 的位置
	while (left < right)            // 当 left 与 right 相遇时退出循环
	{
		// 右边找小
		while (left < right && a[right] >= a[keyi])
		{
			--right;
		}
		// 左边找大
		while (left < right && a[left] <= a[keyi])
		{
			++left;
		}
        // 此时 right 位置上的值要比 keyi 位置上的值小,left 位置上的值要比 keyi 位置上的值大
        // 交换 left 位置与 right 位置上的值。
		Swap(&a[left], &a[right]);      // 交换后 left 位置上的值比 keyi位置上的值小, right 位置上的值比 keyi 位置上的值大。
	}
 
    // left 与 right 相遇
	Swap(&a[left], &a[keyi]);
	keyi = left;            // 生成新的 keyi 位置
	return keyi;
}
 
// 霍尔单趟排序之后, keyi 位置左边的部分都比 keyi位置的值要小,keyi 位置右边的部分都比 keyi位置的值要大。
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值