快排
时间复杂度O(nlogn),空间复杂度O(logn)
#include<bits/stdc++.h>
int a[15]={4,1,2,5,7,8,9,6,3,10};
void qs(int a[],int s,int e)
{int l=s,r=e;if(l>=r)//递归结束条件return ;int mid=a[l];//排序while(l<r){while(l<r&&a[r]>=mid){r--;}a[l]=a[r];while(l<r&&a[l]<=mid)l++;a[r]=a[l];}a[l]=mid;//排完序后基准元素放中间qs(a,s,l);//排左半部分qs(a,l+1,e);//排右半部分}
int main()
{qs(a,0,9);for(int i=0;i<9;i++){printf("%d ",a[i]);}return 0;
}
使用划分函数找到数组第k小(第k大)的元素
空间复杂度O(1),时间复杂度O(n)
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int a[15]= {5,8,7,4,1,3,6,2,9};
int k;
int huafen(int a[],int s,int e)
{int l=s,r=e;int mid=a[l];/* if(l>=r)return 0;*/while(l<r){while(l<r&&a[r]>=mid)r--;a[l]=a[r];while(l<r&&a[l]<=mid)l++;a[r]=a[l];}a[l]=mid;return l;//基准元素排序后的中间位置
}
int func(int a[],int len,int k)
{int left=0,right=len-1,m=0;while(1){m=huafen(a,left,right);if(m==k-1)break;else if(m>k-1)right=m-1;else if(m<k-1)left=m+1;}return a[k-1];
}
int main()
{int n;while(~scanf("%d",&n)){k=n;int k1=func(a,9,n);printf("%d\n",k1);}return 0;
}