演算法歸納(一)

2021-09-25 10:40:03 字數 2594 閱讀 2248

(1)、給定乙個陣列arr,和乙個數num,請把小於等於num的數放在陣列的左邊,大於num的數放在陣列的右邊。要求額外空間複雜度o(1),時間複雜度o(n)

public class demo1 , 5);

}public static void sort(int arr, int num)

}print(arr);

}public static void swap(int arr, int l, int r)

arr[l] = arr[l] + arr[r];

arr[r] = arr[l] - arr[r];

arr[l] = arr[l] - arr[r];

system.out.println(arr[l]+"\t"+arr[r]);

}public static void print(int arr)

}}

(2)、給定乙個陣列arr,和乙個數num,請把小於num的數放在陣列的左邊,等於num的數放在陣列的中間,大於num的數放在陣列的右邊。要求額外空間複雜度o(1),時間複雜度o(n)

public class demo2 , 6);

}public static void sort(int arr, int num) else if (arr[i] > num) else

}print(arr);

}public static void swap(int arr, int l, int r)

//運用的原理是a^a的值是0,0^ b的值是 b

arr[l] = arr[l] ^ arr[r];//左右

arr[r] = arr[l] ^ arr[r];//左右右=左

arr[l] = arr[l] ^ arr[r];//左右左=右

//arr[l]+arr[r]可能會超過int的範圍

/*arr[l]=arr[l]+arr[r];

arr[r]=arr[l]-arr[r];

arr[l]=arr[l]-arr[r];*/

}public static void print(int arr)

}}

(3)、小和問題

public class demo3 ));

}public static int smallsum(int arr)

return mergesort(arr, 0, arr.length - 1);

}public static int mergesort(int arr, int left, int right)

int middle = left + ((right - left) >> 1);//求出中間的數值

//每一步榨取出一小部分的數值,保證每次左邊部分的陣列只需要被右部分榨取即可

return mergesort(arr, left, middle) + mergesort(arr, middle + 1, right) + merge(arr, left, middle, right);

}public static int merge(int arr, int left, int middle, int right)

//下面兩個迴圈必有乙個執行,用於將未完全拷貝的陣列依次按序拷貝進新陣列

while (p1 <= middle)

while (p2 <= right)

i = 0;

//將臨時陣列中的資料拷貝進新陣列

while (i < p.length)

return sum;

}}

(4)、逆序對問題

在乙個陣列中,左邊的數如果比右邊的數大,則折兩個數構成乙個逆序對,請列印所有逆序對。

public class demo4 );

}public static void inverse(int arr)

mergesort(arr, 0, arr.length - 1);

}public static void mergesort(int arr, int left, int right)

int middle = left + ((right - left) >> 1);

mergesort(arr, left, middle);

mergesort(arr, middle + 1, right);

merge(arr, left, middle, right);

}public static void merge(int arr, int left, int middle, int right)

p[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];//左右陣列經過依次比較必然有乙個數進入臨時陣列

}while (p1 <= middle)

while (p2 <= right)

i = 0;

while (i < p.length)

}public static void print(int arr, int num, int left, int right)

}}

回溯演算法歸納

輸入 乙個不包含重複元素的陣列candidates,乙個int target 輸出 用candidates中的元素組成target,輸出有多少種組合。輸出結果不能重複。規則 candidates中的元素可以使用多次。例如candidates 2,3,6,7 target 7,返回 7 2,2,3 結...

遺傳演算法歸納

遺傳演算法 genetic algorithm 是一類借鑑生物界的進化規律 適者生存 優勝劣汰遺傳機制 演化而來的隨機化搜尋方法。其主要特點是直接對結構物件進行操作,不存在求導和函式連續性的限定 具有內在的隱並行性和更好的全域性尋優能力 採用概率化的尋優方法,能自動獲取和指導優化的搜尋空間,自適應地...

排序演算法 歸納總結

一 直接插入排序 氣泡排序和簡單選擇排序是最基本的排序方法,它們主要用於元素個數n n 10000 不是很大的情形。它們的平均複雜度均為o n 2 實現也比較簡單。1 直接插入排序對於規模很小的元素序列 n 25 非常有效。它的時間複雜度與待排序元素序列的初始排列有關。在最好情況下,直接插入排序只需...