日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分治法求第k小元素

發布時間:2023/12/29 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分治法求第k小元素 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*Name: 第k小元素Copyright: Author: Date: 13-04-17 15:28Description: 求一列數中的第k小元素,利用分治的策略進行遞歸求解。模仿快速排序法的思路,只不過每次只遞歸處理第k小元素所在的序列。要注意每次都應該減少搜索的范圍,避免因為隨機數不隨機而導致的死循環 */ #include<iostream> #include<cmath> #include<ctime>using namespace std;int Partition(int A[], int low, int high); int SelectK(int A[], int low, int high, int k); void Swap(int &a, int &b);int main() {const int N = 200;int A[N] = {0};for (int i=0; i<N; i++){A[i] = rand() % 1000;}for (int i=0; i<N; i++){cout << A[i] << " ";}cout << endl;int k = 5;cout << SelectK(A, 0, N-1, k) << endl;for (int i=0; i<N; i++){cout << A[i] << " ";}cout << endl;system("pause");return 0; }void Swap(int &a, int &b) {int temp = a;a = b;b = temp; }int SelectK(int A[], int low, int high, int k) {if (low == high)return A[low];int mid = Partition(A, low, high);int leftLen = mid - low + 1;if (k == leftLen)return A[mid];else if (k < leftLen) //要考慮隨機數不隨機的特殊情形,避免進入死循環 return SelectK(A, low, mid-1, k);elsereturn SelectK(A, mid+1, high, k-leftLen); }int Partition(int A[], int low, int high) {srand((unsigned)time(NULL)); //生成隨機數int i, j = rand() % (high - low) + low; Swap(A[low], A[j]); //把樞紐元素置換到最左端 int x = A[low];i = low; j = high + 1;while (true){while (A[++i] <= x && i < high) ;while (A[--j] > x) ;if (i >= j)break;Swap(A[i], A[j]);} Swap(A[low], A[j]); //把樞紐元素置換到它該處的位置return j; }

總結

以上是生活随笔為你收集整理的分治法求第k小元素的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。