陣列2——查詢第k小元素
阿新 • • 發佈:2018-12-10
在陣列a的前n個元素中找出第k(1≤k≤n)小的元素,例如,陣列{98, 33, 21, 102, 45, 5, 32, 11, 65, 82, 193, 321, 34, 72}中第5小的元素是33。
【分析】
這是上海大學考研試題。要查詢第k小的元素,並不需要完全對陣列中的元素進行排序,可以利用快速排序演算法思想,只對部分元素進行排序就可以找到第k小元素。
一趟排序結束後,若i==k,說明找到了第k小元素,演算法結束。否則,如果i<k,則說明第k小元素在i=1----high之間;如果i>k,則表明第k小元素在low----i-1之間。最後返回最小元素a[k]。
main.cpp
#include <iostream> #include <iomanip> using namespace std; #define MAX 100 int Search_K_Min(int a[],int n,int k); void PrintArray(int a[],int n); void main() { int a[] = { 98, 33, 21, 102, 45, 5, 32, 11, 65, 82, 193, 321, 34, 72 }; int n, k, x; n = sizeof(a) / sizeof(a[0]); cout << "請輸入要查詢第幾小的元素值:" << endl; cin >> k; x = Search_K_Min(a, n, k); cout << "陣列中的元素:"<<endl; PrintArray(a, n); cout << "第" << k << "小的元素值是:"; cout << x << endl; system("pause"); } int Search_K_Min(int a[], int n, int k) { int low, high, i, j, t; k--; low = 0; high = n - 1; do { i = low; j = high; t = a[low]; do { while (i<j&&t<a[j]) { j--; } if (i<j) { a[i++] = a[j]; } while (i<j&&t>=a[i]) { i++; } if (i<j) { a[j--] = a[i]; } } while (i<j); a[i] = t; if (i==k) { break; } if (i<k) { low = i + 1; } else { high = i - 1; } } while (i!=k); return a[k]; } void PrintArray(int a[], int n) { int i; for (i = 0; i < n;i++) { cout << setw(4) << a[i]; } cout << endl; }
結果: