/*
name: 第k小元素
author:
date: 13-04-17 15:28
description: 求一列數中的第k小元素,利用分治的策略進行遞迴求解。
模仿快速排序法的思路,只不過每次只遞迴處理第k小元素所在的序列。
使用消除尾遞迴優化後效果更好。
*/#include#include#include#includeusing namespace std;
const int n = 6000000;
int a[n] = ;
int b1[n] = ;
int b2[n] = ;
int b3[n] = ;
int b4[n] = ;
int b5[n] = ;
int b6[n] = ;
int selectk_1(int a, int low, int high, int k);
int selectk_12(int a, int low, int high, int k);
int selectk_2(int a, int low, int high, int k);
int selectk_22(int a, int low, int high, int k);
int selectk_3(int a, int low, int high, int k);
int selectk_32(int a, int low, int high, int k);
int partition(int a, int low, int high);
int selectk(int a, int low, int high, int k);
int main()
int selectk_12(int a, int low, int high, int k)
}int selectk_2(int a, int low, int high, int k)
swap(a[low], a[j]);
if (j == k)
return a[j];
else if (j > k)
return selectk_2(a, low, j-1, k);
else
return selectk_2(a, i, high, k);
}int selectk_22(int a, int low, int high, int k)
swap(a[low], a[j]);
if (j == k)
return a[j];
else if (j > k)
high = j - 1; //消除尾遞迴selectk_2(a, low, j-1, k);
else
low = i; //消除尾遞迴selectk_2(a, i, high, k); }}
int selectk_3(int a, int low, int high, int k)
swap(a[low], a[j]);
if (j <= k && k < i)
return a[j];
else if (j > k)
return selectk_3(a, low, j-1, k);
else
return selectk_3(a, i, high, k);
}int selectk_32(int a, int low, int high, int k)
swap(a[low], a[j]);
if (j <= k && k < i)
return a[j];
else if (j > k)
high = j - 1; //消除尾遞迴selectk_3(a, low, j-1, k);
else
low = i; //消除尾遞迴selectk_3(a, i, high, k); }}
int selectk(int a, int low, int high, int k)
int partition(int a, int low, int high)
swap(a[low], a[j]); //把樞紐元素置換到它該處的位置
return j;
}
分治演算法求第k小元素
1.問題 用分治的演算法求乙個陣列s n 中第k小的元素。2.解析 採取和快速演算法相同的思路,但是結合分治的思想,選取恰當的基準值。找到基準值以後,再按照快速排序的方法進行查詢就好了。3.設計 int r 5int r group ceil high low 1 1.0 r ceil取上限,總共分...
快速排序(求第k小的數)
快排是利用的partition演算法,基本思想是從第乙個數開始,利用partition演算法將這個數在有序序列中的位置找到,這個數的左邊部分都是小於它的數,右邊部分都是大於他的數,然後通過分治的方法對左右兩個區間再進行partition操作,partition演算法 如下 int partition...
求第k小元素
題目 給定線性序集中n個元素和乙個整數k,其中1 k n,要求找出這n個元素中第k小的元素。如果將這n個元素線性序排列時,如果不存在重複的數或者求第k個元素的時候,那麼第k個位置即為要找的元素。當k 1時,要找的就是最小值 而當k n時,則要找的則是最大值。憑藉著快速排序中的劃分函式,可以實現上面的...