赞
踩
快排算法
#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); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。