學習左程雲演算法課初級班
1,歸併排序,這是分治的思想,例如有乙個陣列,先將左半部分排好序,再將右半部分排好序,最後再將兩邊的數通過乙個輔助陣列將它們逐個放到輔助陣列裡面,這個過程中逐漸比較兩邊頭位置的數的大小。
求乙個陣列的中間位置,可以int mid = l + ((r - l) >> 1);右移運算(位運算)速度快一些。
public
static
void
mergesort(int arr)
mergesort(arr, 0, arr.length - 1);
}public
static
void
mergesort(int arr, int l, int r)
int mid = l + ((r - l) >> 1);
mergesort(arr, l, mid);
mergesort(arr, mid + 1, r);
merge(arr, l, mid, r);
}public
static
void
merge(int arr, int l, int m, int r)
while (p2 <= r)
while (p1 <= m)
for (i = 0; i < help.length; i++)
}
2,快速排序,快排的partition過程。經典排快時間複雜度是nlogn。在工程上一般不會用遞迴函式,遞迴易報錯,工程上遞迴函式一般要改為非遞迴版本。
public
static
int partition(int arr, int l, int r, int p) else
if (arr[l] > p) else
}return
newint ;
}
這個方法返回的是等於區域的首尾下標。
經典快排**:
public
static
void
quicksort(int arr)
quicksort(arr, 0, arr.length - 1);
}public
static
void
quicksort(int arr, int l, int r)
}public
static
int partition(int arr, int l, int r) else
if (arr[l] > arr[r]) else
}swap(arr, more, r);
return
newint ;
}
3,選擇排序
public
static
void
selectionsort(int arr)
for (int i = 0; i < arr.length - 1; i++)
swap(arr, i, minindex);}}
public
static
void
swap(int arr, int i, int j)
public
static
void
selectionsort(int arr)
for (int i = 0; i < arr.length - 1; i++)
}swap(arr, i, minindex);
}}
選擇排序**較簡單。
4,氣泡排序
public
static
void
bubblesort(int arr)
for (int e = arr.length - 1; e > 0; e--) }}
}public
static
void
swap(int arr, int i, int j)
5,堆排序
完全二叉樹(堆就是完全二叉樹),堆分文大根堆和小根堆。大根堆:每個節點的值都不大於其父節點的值,小根堆則反之。
可以把乙個陣列理解為二叉樹,借用二叉樹的結構。把乙個陣列想象成完全二叉樹。
public
static
void heapsort(int arr)
for (int i = 0; i < arr.length; i++)
int size = arr.length;
swap(arr, 0, --size);
while (size > 0)
}public
static
void heapinsert(int arr, int
index)
}public
static
void heapify(int arr, int
index, int size)
swap(arr, largest, index);
index = largest;
left = index * 2 + 1;
}}
先建大根堆,建堆的過程就是heapinsert的過程,時間複雜度低,是logn,其實就是二叉樹的層數,建堆後不一定有序。然後讓最後乙個數和堆頂位置的數交換,換完之後陣列的最後乙個數就是最大的數,然後堆的大小減1,最後這個數就不動了,然後堆再進行乙個heapify的過程,又會重新調整成乙個大根堆,然後又把最後乙個數和堆頂的數交換,以此類推,直到整個陣列有序(每次都是最後乙個數和堆頂的數交換)。
swap(arr, largest, index);
優先順序佇列就是堆。
6,插入排序
public
static
void
insertionsort(int arr)
for (int i = 1; i < arr.length; i++) }}
public
static
void
swap(int arr, int i, int j)
7,桶排序
public static void bucketsort(int arr)
intmax = integer.min_value;
for (int i = 0; i < arr.length; i++)
int bucket = new int[max + 1];
for (int i = 0; i < arr.length; i++)
int i = 0;
for (int j = 0; j < bucket.length; j++)
}}
8,基數排序
public
static
void
radixsort(int arr)
radixsort(arr, 0, arr.length - 1, maxbits(arr));
}public
static
intmaxbits(int arr)
int res = 0;
while (max != 0)
return res;
}public
static
void
radixsort(int arr, int begin, int end, int digit)
for (i = begin; i <= end; i++)
for (i = 1; i < radix; i++)
for (i = end; i >= begin; i--)
for (i = begin, j = 0; i <= end; i++, j++) }}
public
static
intgetdigit(int x, int d)
八大排序演算法java
本文只介紹演算法實現的 預設都這一已經理解演算法思想,若不理解可以參考八大排序演算法思想 交換兩個數 public static void swap int arr,int i,int j 氣泡排序 public static void bubblesort int arr for int i 0 ...
八大排序演算法Java實現
常見的八大排序演算法,它們之間的關係如下 經常碰到這樣一類排序問題 把新的資料插入到已經排好的資料列中。將第乙個數和第二個數排序,然後構成乙個有序序列 將第三個數插入進去,構成乙個新的有序序列。對第四個數 第五個數 直到最後乙個數,重複第二步。首先設定插入次數,即迴圈次數,for int i 1 i...
八大排序演算法
1.直接插入排序 原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。實現 void insertsort node l,int length void shell ...