冒泡排序:
重複地走訪過要排序的數列,每次比較相鄰兩個元素,如果它們的順序錯誤就把它們交換過來,越大的元素會經由交換慢慢“浮”到數列的尾端。
for(int i=0;i<list.length;i++){
for(int j=i+1;j<list.length;j++){
if(list[i]>list[j]){
int temp=list[i];
list[i]=list[j];
list[j]=temp;
}
}
}
快速排序:在待排序的數組選取一個元素作爲基準,將待排序的元素進行分區,比基準元素大的元素放在一邊,比其小的放另一邊,遞歸調用快速排序對兩邊的元素排序。選取基準元素並分區的過程採用雙指針左右交換。
void quickSort(int[] arr,int start,int end){
if(end<=start)
return;
int standard = arr[start];//選取第一個數做中間值
int low = start,high = end;//低位指針和高位指針
while(low<high){
while(low<high&&standard<=arr[high])//從高位開始,選取比中間值小的元素
high--;
arr[low] = arr[high];//找到後退出循環,將小的賦值給低位元素
while(low<high&&standard>=arr[low])//從低位開始,找比中間值大的元素
low++;
arr[high]=arr[low];//找到了,將大的元素放到high的位置處
}
arr[low]=standard;//這兒low==high,標準值放在low/high處,左邊都是小的,右邊都是大的
quickSort(arr,start,low-1);//左邊的再快速排序
quickSort(arr,low+1,end);//右邊的快速排序
}
歸併排序:
分解待排序的數組成兩個各具 n/2 個元素的子數組,遞歸調用歸併排序兩個子數組,合併兩個已排序的子數組成一個已排序的數組。
public void mergeSort(int[] arr) {
int[] temp = new int[arr.length];
mergeSort(arr, temp, 0, arr.length - 1);
}
private void mergeSort(int[] arr, int[] temp, int left, int right) {
// 當left == right時,不需要再劃分
if (left < right) {
int mid = (left + right) / 2;
internalMergeSort(arr, temp, left, mid);
internalMergeSort(arr, temp, mid + 1, right);
mergeSortedArray(arr, temp, left, mid, right);
}
}
// 合併兩個有序子序列
public void mergeSortedArray(int[] arr, int[] temp, int left, int mid, int right) {
int i = left;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= right) {
temp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];
}
while (i <= mid) {
temp[k++] = arr[i++];
}
while (j <= right) {
temp[k++] = arr[j++];
}
// 把temp數據複製回原數組
for (i = 0; i < k; i++) {
arr[left + i] = temp[i];
}
}
二叉樹
class TreeNode {
public TreeNode left, right;
public int val;
public TreeNode(int val) {
this.val = val;
}
}