(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 非常有效。它的時間複雜度與待排序元素序列的初始排列有關。在最好情況下,直接插入排序只需...