快排中划分思想的应用

快速排序大家都熟悉,其中最为关键的是划分函数。我们一定要理解和应用划分的思想,这个可以解决很多问题,且听分析;
1.输出第K个小的数。大家很容易想到的是先排序一番,然后循环输出到第K个就是了。还容易想到的是小顶堆排序的算法。现在我来介绍一个新的方法,就是利用快排的划分思想
先来说说这个思想:首先找一个纽轴可以是随机的,也可以是第一个(为了方便就取第一个吧,其实选择这个纽轴有时候也很关键)。然后与高位比较如果比它小,高位的指针减一 否者与高位的数交换。类似,与地位比较。
算法大概:
priv=a[low];
while(low<high){
while(low<high&&priv<a[high])high--;
a[low]=a[high];
while(low<high&&priv>a[low])low++;
a[high]=a[low];
}
a[low]=priv;
我们模拟快速排序算法,就知道每次纽轴确定的值就是最后排序完之后的那个位置。所以我们不用全部排序完,也能在到那个位置。
if(low==k){
return a[low];
}else if(low>k){
//递归调用
}else{

//递归调用

具体代码:

int k_elem(int b[],int low,int high,int k){//i起始坐标,j为终止坐标,k为第k个小的坐标
	int proiv=b[low];
	int tem_low=low;//临时的low,high
	int tem_high=high;
	while(low<high){
		while(low<high&&proiv<=b[high])high--;
		b[low]=b[high];
		while(low<high&&proiv>=b[low])low++;
		b[high]=b[low];
	}
	b[low]=proiv;
	if(k==low){
		return b[low];
	}else if(k>low){
		return k_elem(b,low+1,tem_high,k);
	}else{
	return	k_elem(b,tem_low,low-1,k);
	}
}


}
2.把一个数组的奇数放在偶数的前面
思想:从前想后找到一个偶数,在从后向前找到一个奇数,然后交换。
int i=0;j=len-1;
while(i<j){
while(i<j&&a[i]%2!=0)i++;//从前向后找奇数
while(i<j&&a[j]%2==0)j--;//从后向前找偶数
swap(a[i],a[j]);
i++;
j--;

}

具体代码:

#include<stdio.h>
void move(int a[],int n){
	int i=0,j=n-1;
	while(i<j){
		while(i<j&&a[i]%2!=0)i++;
		while(i<j&&a[j]%2==0)j--;
		int temp=a[i];
		a[i]=a[j];
		a[j]=temp;
	}
}
int main(){
	int a[]={1,2,3,4,5,6,7,8,9,10};
	move(a,10);
	for(int i=0;i<10;i++){
		printf("%d",a[i]);
	}
	return 0;
}


当然还有很多应用有待总结
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值