快排以及Partition算法寻找第k元素

 快速排序

算法思想: 

采用分治法

(1)每轮排序选取一个轴值,将小于轴值的值调整到轴值左边,大于轴值的值调整到轴值右边

(2)对左右两部分继续进行(1)操作

算法实现:

选取轴值调整元素位置部分写成一个partition算法,也就是分块函数,这个函数最终可以返回一个轴值在数组中的位置,于是这个算法可以衍生到求kth元素。

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;


//利用partition算法可以寻找第K元素或者前N小元素:关键在于对快排的改变,分区寻找 
int partition(int arr[],int left,int right){
	int axis = arr[left];  //取左结点为轴点并保存下来,如此可以将左结点当做一个空节点用来交换数据 
	while(left<right){ //循环终止条件为left与right指向同一位置,也就是说空节点移到了此处 
		while(left<right&&arr[right]>axis) right--;//arr[right]值大于轴点就将right指针左移,也就是right-- 
		arr[left] = arr[right];
		while(left<right&&arr[left]<=axis) left++;// arr[left]值小于等于轴点就将left指针右移,也就是left++ 
		arr[right] = arr[left]; 
	}
	arr[left] = axis; //将保存的轴点替换到空节点处,完成了这一轮的分区 
	return left;//返回交汇的位置
}
//快排 
void quickSort(int A[],int left, int right){
	if(left<right){
		int pos  = partition(A,left,right);
		quickSort(A,left,pos-1);
		quickSort(A,pos+1,right);
	}
}

//寻找kth 元素(从0开始)
int findKthElement(int A[],int k,int left,int right){
	if(k<left||k>right||right<left) return -1; //保证代码鲁棒性 
	int pos = partition(A,left,right);
	cout<<"k:"<<k<<endl;
	cout<<"pos:"<<pos<<endl;
	if(pos == k) return A[pos];
	else if(pos>k){
		return findKthElement(A,k,left,pos-1);
	}
	else if(pos<k){
		return findKthElement(A,k,pos+1,right);
	}	
} 
int main(){
	int arr[] = {1,9,2,8,3,7,4,6,5};
	quickSort(arr,0,8);
	for(int i=0;i<9;i++){
		cout<<arr[i]<<endl;
	}
	cout<<"第"<<6<<"小的元素:"<<findKthElement(arr,2,0,0);
	
	
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值