借鑑快速排序演算法,返回每趟確定的乙個元素的位置,與n比較。在快速排序中使用隨機生成的樞軸,如果資料排列均勻,也可以選第乙個數作為樞軸。
//
// created by dgm on 2020/1/3.
//#include
#include
#include
using
namespace std;
int n;
int*a;
int k;
intpartation
(int left,
int right)
a[left]
=temp;
return left;
//返回樞軸元素的最終位置
}void
selectnum
(int left,
int right,
int k)
else
if(pos+
1else}}
intmain()
selectnum(0
,n-1
,k);
return0;
}
將乙個整數集合s劃分為兩個子集s1和s2,分別含有n1和n2個元素,s1與s2的並為s,交為空。要求:在|n1-n2|盡可能小的條件下,使s1元素的和與s2元素的和的差的絕對值即|s1-s2|盡可能大。
以前的做法:將s排序,求前一半和後一半的差。
現在的做法:如果樞軸元素恰好在中間位置,將樞軸元素及之前和之後的元素分別求和,然後作差取絕對值。
//
// created by dgm on 2020/1/3.
//#include
#include
#include
using
namespace std;
int n;
int*a;
int res=0;
intpartation
(int left,
int right)
a[left]
=temp;
return left;
}int
maxabs
(int left,
int right)
if(n%2==
1)res+
=abs
(a[n-1]
);//如果有奇數個元素,則兩個集合元素數目相差一
return res;
}else
if(pos1)
else}}
intmain()
printf
("%d\n"
,maxabs(0
,n-1))
;return0;
}
取出列表中第N大的數
array list range 10 random.shuffle array print array deffunc1 array,n d,k n while k 0 maxnum,maxindex float inf 0 for index,value in enumerate array i...
從M個數中選擇前N大的數
如果對m個數字全排列,1 用簡單排序演算法,例如氣泡排序,時間複雜度m m 2 用快速排序 最壞時間複雜度度蛻化為m m 堆排序歸併排序 平均時間負責度為m logm 此處,需要選擇前n大的數,用氣泡排序,迴圈次數為n,時間複雜度為m n 如果是海量資料呢?筆試時經常碰到這樣類似的題目 從100w個...
選擇第n大的數(分治法和排列實現)
個人心得 在買的書上看到的乙個經典分治題,題目意思就是給定乙個陣列,求第k小的數。第一反應就是排序,然後返回第k 1位置的數就可以了,這樣演算法的複雜度是nlongn,在快速排序的基礎下還是挺不錯的。不過為了學習分治法還是換種思路,這也是建立在快速排序的方法,因為快排是以第乙個作為標準,比他小的數在...