1.合並數列算法代碼
public List<Integer> merge(List<Integer> A,List<Integer> B){
int i = 0,j = 0;
List<Integer> C = new ArrayList<Integer>();
while(i<A.size() && j<B.size()){
if(A.get(i)<B.get(j)){
C.add(A.get(i));
i++;
}else{
C.add(B.get(j));
j++;
}
}
if(i==A.size()){
for(;j<B.size();j++){
C.add(B.get(j));
}
}else{
for(;i<A.size();i++){
C.add(A.get(i));
}
}
return C;
}
}
2.選擇算法代碼
public List<Integer> sort(List<Integer> nums){
for(int i = 0;i<nums.size();i++) {
for(int j=i+1;j<nums.size();j++) {
int jiaohuan;
if(nums.get(i)>nums.get(j)) {
jiaohuan = nums.get(j);
nums.set(j,nums.get(i));
nums.set(i,nums.get(j));
}
}
}
return nums;
}
3.冒泡排序算法代碼
public List<Integer> sort(List<Integer> nums){
for(int i = 0;i<nums.size()-1;i++) {
for(int j = 0;j<nums.size()-1;j++) {
int jiaohuan;
if(nums.get(j)>nums.get(j+1)) {
jiaohuan = nums.get(j+1);
nums.set(j+1, nums.get(j));
nums.set(j, jiaohuan);
}
}
}
return nums;
}
4.堆排序思維
·修改子節點值,向上移
·修改子節點值,向下移
·最大堆性質:根節點永遠比兩個子節點大
·最小堆性質:根節點永遠比兩個子節點小
5.堆建立
·最大堆
·
6.基數排序思維
·10個桶:0-9
·按最后一位進行排,也就是個十百千,個位桶排序取出再到十位桶
·
7.union,find操作
·find(x):尋找元素 x 所在集合
·union(x,y):把元素 x 和元素 y 所在集合合並成一個集合
·union(x,y)操作,那個樹的高度大就拿那個樹來當根節點
·路徑壓縮:find(x) 操作時,找到 x 的根結點 y 之后,再沿着 x 到 y 的路徑,改變路徑上所有結點的父指針,使其直接指向 y
·
8.遞歸階乘代碼
public static int factorial(int n){
if(n==0 && n == 1){
return 1;
}else{
return n*factorial(n-1);
}
}
9.遞歸整數冪代碼
public static int power(int x,int n){
if(n==0){
return 1;
}else{
y=power(x,n/2);
y=y*y;
if(n%2==1){
y=y*x;
}
}
return y;
}
10.斐波那契遞歸算法代碼:
public static int factorial(int n){
if(n ==1 || n==2){
return 1;
}else{
return factorial(n-1)+factorial(n-2);
}
}
11.數組主元素代碼
public int getCandidate(int nums[], int begin, int end ){
int j = begin,count =1;
int c = nums[j];
while(j<end-1 && count>0){
j++;
if(nums[j]==c){
count++;
}else{
count--;
}
}
if(j==end-1 && count>0){
return nums[j];
}else if(j==end-1 && count == 0){
return 0;
}else{
return getCandidate(nums,j,end);
}
}
12.分治合並算法代碼
public List<Integer> merge_sort(List<Integer> nums,int low,int high){
int min;
if(low<high){
mid = (high-low)/2;
merge_sort(nums,low,mid);
merge_sort(nums,mid+1,high);
merge(nums,low,mid,high,high-low)
}
return nums;
}
13.快速排序代碼和思維
·
·
·
·
·
·
·
·
·
·
·
public void quick_sort(List<Integer>nums,int n,int m){
if(n<m){
int pos=split(nums,n,m)
int quick_sort(nums,n,pos-1);
int quick_sort(nums,pos+1,m)
}
}
14.線性選擇排序思維
·利用快速排序的思維去分區找到元素
線性選擇,第三大需要幾次分區
137,96,88,108,17,87,65,35,76,45,66,18
17,18,88,108,137,87,65,35,76,45,66,96
88,66,45,87,65,35,76,96,108,137
需要兩次
15.選擇排序思維
·
16.貪婪算法思維
·不斷地從問題的 n 個元素中選取一個最優的元素的取值
·背包問題(可以分割),背包中可以放7個物體,背包載重量為20,有7個物體載重價值為12,7,5,19,20,18,13,物理重量分別為4,5,3,9,10,11,18.
17.狄斯奎諾算法思維
確定V1,根據V1去更新
根據權重最小的點V4去更新
根據權重第二小的點V2去更新
更新表之后,第三小的權重的點是V3去更新
根據權重確定V7的點去更新
根據權重確定V6的點去更新
根據權重確定V5的點去更新
18.克魯斯卡爾算法思維
·選擇邊的權重最小的優先,但要避免有環
19.普利姆算法思維
·從一點觸發,依次選取權值最小的路徑,但選取的范圍是經過的點的所有邊,也要避免有環
20.霍夫曼編碼思維
21.圖遍歷
22.動態規划
·貨郎擔問題
·最短路徑問題
23.最長公共子序列
·
·背包問題:5個物體重量分別為2,2,6,5,4,價值分別為6,3,5,4,6,背包的載重量為10,求裝入背包的物體及其總價值
·