快排算法
#include<iostream>
using namespace std;
void quick_sort(int l,int r,int q[]) //l,r分别为左边界和右边界
{
int i = l - 1;//因为接下来l和r会进行++和--,如果不这么做数组会越界
int j = r + 1;
int x = q[(l+r)/2] //x是标志值,可以选最左端也可以选最右端,也可以选中间,印象中408的2019年选择题好像考察过这个内容,有时间会贴出来
while(i < j)
{
do i++;while(q[i] < x);
do j--;while(q[j] > x);
if(i < j) swap(q[i],q[j]);
}
quick_sort(l,j,q);
quick_sort(j+1,r,q);
}
归并算法
int N = 1e6;
int a[N],temp[N]//原数组和临时存放的数组
merge__sort(int l,int r,int q[])
{
if(l >= r)
return;
int mid = l+r >>1;
merge_sort(l,mid,q[]);
merge_sort(mid + 1,r,q[]);
int i = l;
int j = mid + 1;
int k = 0;
while(i <= mid && j <= r)
{
if(q[i]<=q[j])
temp[k++] = q[i++];
else
temp[k++] = q[j++];
if(i <= mid)
temp[k++] = q[i++];
else if(j <= r)
temp[k++] = q[j++];
for(i = l,j =0;i < r;i++,j++)
q[i] = temp[j++];
}
}
找出第k小的数(利用快排算法的思想)
法一:直接快排得到数组,再遍历一边(....暴力解,408大题应该扣两分)
法二:
#include<iostream>
using namespace std;
const int N = 100010;
int q[N];
int quick_sort(int l, int r,int k)//这里因为要处理的元素是k,所以将k作为参数
{
if(l == r)
return q[l]; //先判断递归终止条件,跳出递归
int i = l - 1;
int j = r + 1;
int x = q[(l+r)/2]
while(i < j)
{
do i++;while(q[i] < x);
do j--;while(q[j] > x);
if(i < j) swap(q[i],q[j]);
}
int s1 = j - l + 1;//判断当前小于当前标志元素的元素有几个
if(s1 < k)
return quick(j + 1,r,k - s1);//如果当前个数小于k个,要在标志元素的右边再找(k-s1)个
else
return quick(l,j,k);
}