知识大全 求一个无序数组中第k小的数字
Posted 中位数
篇首语:满堂花醉三千客,一剑霜寒十四州。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 求一个无序数组中第k小的数字相关的知识,希望对你有一定的参考价值。
算法思想 找一个点 然后放到末尾 然后将小于这个数的值放在数组前面 大于这个值的放在数组后面 然后在将这个末尾的数放回 这个末尾数放入的位置i代表已经找到第i小的数 放入的位置如果是k 就找到了第k小的数
同样找到第k大的数类似的解法 找到前k个最大数也一样 找一个数组的中位数也一样做 求n个数组的中位数也一样的做 求n个数组的前k个大数或小数也类似可以做
代码
/*************************************** 输入: ? n:数组元素的个数 ? k:第几大的数 a:待查找的数组元素 ****************************************/ #include ? <stdio h> #include ? <stdlib h> #include ? <time h>
#define ? N ?
void ? Rand_select( ? int* ? int ? int ? ); int ? partition( ? int* ? int ? int ? ); int ? swap( ? int& ? int& ? ); int ? k ? ans;
int ? main() int ? n ? a[N] ? i; while( ? scanf( ? &# ;%d%d&# ; ? &n ? &k ? ) ? != ? EOF ? ) srand(time(NULL)); k&# ;; for( ? i ? = ? ; ? i ? < ? n; ? i++ ? ) scanf( ? &# ;%d&# ; ? a ? + ? i ? ); Rand_select( ? a ? ? n ? ); printf( ? &# ;%d\\n&# ; ? ans ? ); return ? ;
void ? Rand_select( ? int ? a[] ? int ? p ? int ? q ? ) int ? m; if ? (p ? <= ? q) m ? = ? partition( ? a ? p ? q ? ); if( ? k ? == ? m ? ) ? ? ? ? ? ? ans ? = ? a[m]; ? ? ? ? ? return; ? ? ? ? ? ? ? else ? if( ? k ? > ? m ? ) Rand_select( ? a ? m+ ? q ? ); else Rand_select( ? a ? p ? m ? );
int ? partition( ? int ? a[] ? int ? p ? int ? q ? ) int ? last ? i; if( ? q ? != ? p ? ) swap( ? a[rand()%(q p)+p] ? a[p] ? ); for( ? i ? = ? p+ ? last ? = ? p; ? i ? <= ? q; ? i++ ? ) if( ? a[i] ? >= ? a[p] ? ) swap( ? a[i] ? a[++last] ? ); swap( ? a[last] ? a[p] ? ); return ? last;
int ? swap( ? int ? &p ? int ? &q ? ) int ? temp ? = ? p; p ? = ? q; q ? = ? temp; return ? ;
#include <iostream>; using namespace std;
void swap(int& a int& b) int temp = a; a = b; b = temp;
int k_smallest(int k int a[] int left int right) int pivot = a[right]; //the last item as pivot int i = left; int j = right ; for(;;) for(; a[i]<pivot; i++); for(; a[j]>;=pivot; j&# ;); if(i<j) swap(a[i] a[j]); else break; swap(a[i] a[right]); //now i is the pivot index in the array //i e a[i] is the (i+ )th smallest item
if(k==i left+ ) return a[i]; else if(k < i left+ )? ? //target before pivot return k_smallest(k a left i ); else? ?//target after pivot return k_smallest((k (i left+ )) a i+ right);
//find the k_th smallest item in the array int Kth_smallest(int k int a[] int size) return k_smallest(k a size );
int main() int a[ ] = ;
for(int i= ; i<= ; i++) cout<<Kth_smallest(i a )<<&# ; &# ;;
【转自】foxhaw/blog/cns! bcbd c! entry
int MaxK(int* data size_t len int k)//类似快排的思想 int *source = data; while(true) int l = source[ ]; int left = ; int right = len &# ; ; while(left != right) while((l > source[left]) && (right > left))left++; while((l < source[right]) && (right > left))right&# ;; swap(source left right); if(left == k &# ; ) return max(source[ ] source[left]); else if(left > k &# ; ) if(source[ ] > source[left]) swap(source left ); //return MaxK(source left k); len = left; else //return MaxK(source+left len &# ; left k &# ; left ); source += left; len = len &# ; left; k = k &# ; left;
return ;
int heapsort(int *data int n int bigk)//利用堆排序 存在一种优化方案 建立K大的堆 int data[] = ; //Part int i j j k; int tmp;
for(k = (n>> ) &# ; ; k >= ; k&# ;) tmp = data[k];
for(j = k; (j<< ) <= n ; j = i) j = j << ; if(j + > n ) i = j + ; else if(data[j + ] < data[j + ]) i = j + ; else i = j + ;
? if(tmp < data[i]) data[j] = data[i]; else break; data[j] = tmp;
//Part int range = n &# ; bigk; for(k = n ; k > range ; k&# ;) tmp = data[k]; data[k] = data[ ]; for(j = ; (j<< ) <= k ; j = i) j = j<< ; if(j + > k ) i = j + ; else if(data[j + ] < data[j + ]) i = j + ; else i = j + ; if(tmp < data[i]) data[j] = data[i]; else break; data[j] = tmp; return data[range];
int nthstl(int* source size_t len int k)//利用STL库中的方案 typedef vector<int> IntVector ;
? //Define an iterator for template class vector of strings typedef IntVector::iterator IntVectorIt ;
? IntVector Numbers(len) ; for(int i = ; i < len; i++) Numbers[i] = source[i]; IntVectorIt start end it ;
? start = Numbers begin() ; end = Numbers end() ;
? nth_element(start start+k end) ;
return Numbers[k ];
int stlk(int* source size_t len int k)//利用STL库中的方案 即建立K大的堆
typedef vector<int> IntVector ;
? //Define an iterator for template class vector of strings typedef IntVector::iterator IntVectorIt ;
? IntVector Numbers(len) ; for(int i = ; i < len; i++) Numbers[i] = source[i]; IntVectorIt start end it ;
? start = Numbers begin() ; end = Numbers end() ;
? partial_sort(start start+k end) ;
return Numbers[k ];
可以先用快速排序进行排序 其中用另外一个进行地址查找 代码如下 在VC++ 运行通过 给分吧^ ^
//快速排序
#include <iostream>
using namespace std;
int Partition ? (int *L int low int ? high) int temp ? = ? L[low]; int pt ? = ? L[low];
while ? (low ? < ? high) while ? (low ? < ? high ? && ? L[high] ? >= ? pt) &# ;high; L[low] ? = ? L[high]; while ? (low ? < ? high ? && ? L[low] ? <= ? pt) ++low; L[low] ? = ? temp; L[low] ? = ? temp;
return low;
void QSort ? (int *L int low int ? high) if ? (low ? < ? high) int pl ? = ? Partition ? (L low high);
QSort ? (L low pl ? &# ; ? ); QSort ? (L pl ? + ? high);
int main ? () int narry[ ] addr[ ]; int sum ? = ? t;
cout ? << ? &# ;Input ? number:&# ; ? << ? endl; cin ? >> ? t;
while ? (t ? != ? ) narry[sum] ? = ? t; addr[sum ? ? ] ? = ? t; sum++;
cin ? >> ? t;
sum ? = ? ; QSort ? (narry sum);
for ? (int ? i ? = ? ; ? i ? <= ? sum;i++) cout ? << ? narry[i] ? << ? &# ;\\t&# ;; cout ? << ? endl;
int k; cout ? << ? &# ;Please ? input ? place ? you ? want:&# ; ? << ? endl; cin ? >> ? k;
int aa ? = ? ; int kk ? = ? ; for ? (;;) if ? (aa ? == ? k) break; if ? (narry[kk] ? != ? narry[kk ? + ? ]) aa ? += ? ; kk++;
cout ? << ? &# ;The ? NO &# ; ? << ? k ? << ? &# ;number ? is:&# ; ? << ? narry[sum ? ? kk] ? << ? endl; cout ? << ? &# ;And ? it&# ;s ? place ? is:&# ; ? ; for ? (i ? = ? ;i ? < ? sum;i++) if ? (addr[i] ? == ? narry[sum ? ? kk]) cout ? << ? i ? << ? &# ;\\t&# ;;
return ;
这道题去年baidu笔试也出现过 当时写的是这个答案 高手分析下 #include ? <math h> #include ? <time h> #include ? <string> #include ? <iostream> #include ? <vector> using ? namespace ? std;
#define ? n ? #define ? k ?
cha138/Article/program/sjjg/201405/30745相关参考