算法导论笔记 快速排序(随机数优化版)

 

/*升序快排(随机数版)*/
int Partition(int *arr, int l, int r) {
		srand(int(time(0)));
		int p = rand() % (r - l + 1) + l;
		swap(arr[p], arr[r]);//以最后一个元素为基准(随机选取一个数作为最后一个数)
		int x = arr[r];
		int i = l, j = r;
		while (i < j) {
			/*如果以第一个元素为基准仅需交换两个while循环执行顺序*/
			while (arr[i] <= x && i < j) ++i;	//最左边大于x的数
			arr[j] = arr[i];	//放右边
			while (arr[j] >= x && i < j) --j;//最右边小于x的数
			arr[i] = arr[j];	//放左边
		}
		arr[i] = x;	//i即为中点
		return i;
}
/*辅助函数*/
void quick_sort(int *arr, int l, int r) {
	if (l < r) {
		int p = Partition(arr, l, r);
		quick_sort(arr, l, p - 1);
		quick_sort(arr, p + 1, r);
	}
}
/*降序快排(随机数版)*/
int Partition(int *arr, int l, int r) {
		srand(int(time(0)));
		int p = rand() % (r - l + 1) + l;
		swap(arr[p], arr[r]);//以最后一个元素为基准(随机选取一个数作为最后一个数)
		int x = arr[r];
		int i = l, j = r;
		while (i < j) {
			/*如果以第一个元素为基准仅需交换两个while循环执行顺序*/
			while (arr[i]>= x && i < j) ++i;	//最左边小于x的数
			arr[j] = arr[i];	//放右边
			while (arr[j] <= x && i < j) --j;//最右边大于x的数
			arr[i] = arr[j];	//放左边
		}
		arr[i] = x;	//i即为中点
		return i;
}
/*辅助函数*/
void quick_sort(int *arr, int l, int r) {
	if (l < r) {
		int p = Partition(arr, l, r);
		quick_sort(arr, l, p - 1);
		quick_sort(arr, p + 1, r);
	}
}
/*
    第K大数(随机数版)
*/
int Partition(int *arr, int l, int r, int k) {
		srand(int(time(0)));
		int p = rand() % (r - l + 1) + l;
		swap(arr[p], arr[r]);//以第一个元素为基准(随机选取一个数作为最后一个数)
		int x = arr[r];
		int i = l, j = r;
		while (i < j) {
			while (arr[i] >= x && i < j) ++i;	//最左边小于x的数
			arr[j] = arr[i];	//放右边
			while (arr[j] <= x && i < j) --j;//最右边大于x的数
			arr[i] = arr[j];	//放左边
		}
		arr[i] = x;	//i即为中点
		if (i - l + 1 == k) return arr[i];    //第K大数
        /*第K大数在i的右边*/
		else if (i - l + 1 < k) return Partition(arr, i + 1, r, k - (i - l + 1));
        /*第K大数在i的左边*/
		else return Partition(arr, l, i - 1, k);
}
/*
/*第K大数(以第一个元素为基准)*/
int Partition(int *arr, int l, int r, int k) {
		srand(int(time(0)));
		int p = rand() % (r - l + 1) + l;
		swap(arr[p], arr[l]);//以最后一个元素为基准(随机选取一个数作为最后一个数)
		int x = arr[l];
		int i = l, j = r;
		while (i < j) {
			/*如果以第一个元素为基准仅需交换两个while循环执行顺序*/
			while (arr[j] <= x && i < j) --j;//最右边大于x的数
			arr[i] = arr[j];	//放左边
			while (arr[i] >= x && i < j) ++i;	//最左边小于x的数
			arr[j] = arr[i];	//放右边
		}
		arr[i] = x;	//i即为中点
		if (i - l + 1 == k) return arr[i];
		else if (i - l + 1 < k) return Partition(arr, i + 1, r, k - (i - l + 1));
		else return Partition(arr, l, i - 1, k);
}
*/
/*第K小数,以第一个元素为基准*/
int Partition(int *arr, int l, int r, int k) {
		srand(int(time(0)));
		int p = rand() % (r - l + 1) + l;
		swap(arr[p], arr[l]);//以第一个元素为基准(随机选取一个数作为最后一个数)
		int x = arr[l];
		int i = l, j = r;
		while (i < j) {
			/*如果以最后一个元素为基准仅需交换两个while循环执行顺序*/
			while (arr[j] >= x && i < j) --j;//最右边小于x的数
			arr[i] = arr[j];	//放左边
			while (arr[i] <= x && i < j) ++i;	//最左边大于x的数
			arr[j] = arr[i];	//放右边
		}
		arr[i] = x;	//i即为中点
		if (i - l + 1 == k) return arr[i];
		else if (i - l + 1 < k) return Partition(arr, i + 1, r, k - (i - l + 1));
		else return Partition(arr, l, i - 1, k);
}

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值