快速排序
算法思想:
采用分治法
(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;
}