快速排序算法

 

//快速排序算法
//partition 分割算法
//第一种是选取区间的第一个元素作为pivot
int partition_first(Elemtype A[], int low, int high){
	Elemtype pivot = A[low];
	while(low < high){
		while(low < high && A[high] >= pivot) --high;
		A[low] = A[high];
		while(low < high && A[low] <= pivot) ++low;
		A[high] = A[low];
	}
	A[low] = pivot;
	return low;
}
//第二种是随机选取区间的任意一个元素作为pivot
int partition_random(Elemtype A[], int low, int high){
	int random_index = random()%(high - low + 1);
	swap(A[low], A[random_index]);
	Elemtype pivot = A[low];
	int i = low;
	for(int j = low + 1;j <= high; ++j)
		if(A[j] < pivot)
			swap(A[++i], A[j])
	swap(A[i], A[low]);
	return i;
}
//快速排序
void quicksort(Elemtype A[], int low, int high){
	if(low >= high) return;
	int i = partition_first(A, low, high);
	quicksort(A, low, i - 1);
	quicksort(A, i + 1, high);
}
//找出序列中第k小的数
int find_k(Elemtype A[], int low, int high, int k){
	int i = partition_first(A, low, high);
	if(i == k) return A[i];
	if(i > k) return find_k(A, low, i - 1, k);
	if(i < k) return find_k(A, i + 1, high, k - i);
}
/*将由n个正整数构成的集合A划分成两个不相交的子集A1和A2,元素个数分别为n1和n2,
A1和A2中的元素和分别是S1和S2。要求|n1-n2|最小且|S1-S2|最大
*/
void setPatition(int A[], int n){
	int low = 0, high = n - 1;
	int low0 = 0, high0 = n - 1, k = n / 2;
	int pivot, s1 = 0, s2 = 0;
	int flag = 1;
	int i;
	while(flag){
		while(low < high){
			pivot = A[low];
			while(low < high && A[high] >= pivot) --high;
			A[low] = A[high];
			while(low < high && A[low] <= pivot) ++low;
			A[high] = A[low];
		}
		A[low] = pivot;
		i = low;
		if(i == k - 1) flag = 0;
		if(i < k - 1){
			low = ++low0;
			high = high0;
		}
		if(i > k - 1){
			high = --high0;
			low = low0;
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值