知识大全 求一个无序数组中第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

    相关参考