知识大全 求一个无序数组中第k小的数字

Posted 中位数

篇首语:满堂花醉三千客,一剑霜寒十四州。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 求一个无序数组中第k小的数字相关的知识,希望对你有一定的参考价值。

算法思想 找一个点 然后放到末尾 然后将小于这个数的值放在数组前面 大于这个值的放在数组后面 然后在将这个末尾的数放回 这个末尾数放入的位置i代表已经找到第i小的数 放入的位置如果是k 就找到了第k小的数

同样找到第k大的数类似的解法 找到前k个最大数也一样 找一个数组的中位数也一样做 求n个数组的中位数也一样的做 求n个数组的前k个大数或小数也类似可以做

代码

  • //?swap?o?number
  • void?swap(int?&i ?int?&j)
  • int?temp?=?i;
  • i?=?j;
  • j?=?temp;
  • //?find?a?position?to?partition?the?array
  • int?partition(int?start ?int?end)
  • return?end/ +start/ ;
  • //?quick?sort
  • int?QuickSort(int?a[] int?start ?int?end)
  • if(start?>?end)
  • throw?&# ;error&# ;;
  • if(start?==?end)
  • return?end;
  • int?p?=?partition(start end);
  • int?i?= ;
  • swap(a[p] a[end]);
  • int?j?=?end ;
  • while(j>=i)
  • while(a[i]<a[end])
  • i++;
  • while(j?>=? ?&&?a[j]>a[end])
  • j&# ;;
  • swap(a[i] a[j]);
  • swap(a[i] a[j]);
  • swap(a[i] a[end]);
  • return?i;
  • //?find?the?k th?smaller?number
  • int?FindK(int?a[] ?int?num int?kth)
  • if(kth?>?num?||?kth?<=? )
  • throw?&# ;error:?no?such?k th?number&# ;;
  • int?k?=?kth ;//?because?the?array?index?starts?with? ?not? ;
  • int?position=? ;
  • int?start?=? ;
  • int?end?=?num ;
  • while(position?!=?k)
  • position?=?QuickSort(a start end);
  • if(position?<?k)
  • start?=?position+ ;
  • else
  • end?=?position ;
  • return?a[position];
  • /*************************************** 输入: ? 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

    相关参考

    知识大全 求一个数组元素的所有排列组合

      //array为要组合的数组size为长度firstIndex为要放在所以组合最前面的元素result保存所有组合每一行为一个组合  publicintfunc(int[]arrayint[][]

    知识大全 求高人指点

    VB打乱数组简单的说就是有一个数组(1,2,3,4)他这个数组顺序打乱!求高人指点  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内

    知识大全 求一个带公式的Excel表格,出库入库管理,库存,只要我输入一个数字,库存自动改变

    求一个带公式的Excel表格,出库入库管理,库存,只要我输入一个数字,库存自动改变  以下文字资料是由(本站网www.cha138.com)小编为大家搜集整理后发布的内容

    知识大全 数据结构考研分类复习真题 第五章 数组和广义表[40]

      设整数xx…xn已存放在数组A中编写一PASCAL递归过程输出从这n个数中取出所有k个数的所有组合(k<=n)例若A中存放的数是k为则输出结果应为【山东大学五 (分)】  类似本题

    知识大全 数据结构考研分类复习真题 第五章 数组和广义表[3]

      将一个A[]的三对角矩阵按行优先存入一维数组B[‥]中A中元素A(即该元素下标i=j=)在B数组中的位置K为(   )供选择的答案【北京邮电大学二(分)】  A&nb

    知识大全 数据结构考研分类复习真题 第五章 数组和广义表[28]

      指出下列算法中错误低效之处并将其改成一个正确且高效的算法  PROCEDURE delk(Amlastik);  {从数组A[1last]中删除第i个元素起的k个元素m为A上限}  BE

    知识大全 数据结构考研分类复习真题 第五章 数组和广义表[29]

      .上三角阵A(N*N)按行主序压缩存放在数组B中其中A[ij]=B[k]写出用ij表示的k【北京工业大学二(分)】  设有上三角矩阵(aij)n*n将其上三角中的元素按先行后列的顺序存于数组B(:

    知识大全 数据结构考研分类复习真题 第十章 答案[27]

      设归并路数为k归并趟数为s则s=élogkù因élogkù=所以k=即最少路归并  证明由置换选择排序思想第一个归并段中第一个元素是缓冲区中最小的元素以后每选一个元素都不应小于前一个选出的元素故当

    探底神针的技术特征

    探底神针的技术特征技术特征:1、三根K线中第一根K线是中阴线;2、第二根K线是长下影线,需要注意的第二根K线的开盘价和收盘价都要小于或等于第一根K线的收盘价;3、第三根K线是中阳线,需要注意必须有量能

    试论述Na+-K+泵的结构及作用机理。

    (1)结构:由两个亚单位构成:一个大的多次跨膜的催化亚单位(α亚基)和一个小的单次跨膜具组织特异性的糖蛋白(β亚基)。前者对Na+和ATP的结合位点在细胞质面,对K+的结合位点在膜的外表面。  (2)