適合面試手擼的排序演算法實現
前言
各種排序的實現方式很多,每種排序針對資料狀態,時間複雜度等等這裡不講。只給程式碼。起因大概是我當時想找一篇好點的彙總文章找不到。適合手擼。例如考官讓你手擼一下快排之類的。
交換
private static void exch(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
測試程式碼
public static void main(String[] args){
int[] arr = {1,9,8,6,2,4,7,5,5};
sort(arr);
System.out.println(Arrays.toString(arr));
}
選擇排序
public void selectSort(int[] arr){
for(int i = 0;i < arr.length;i++){
int min = i;
for(int j = i+1;j < i;j++){
if(arr[min] > arr[j]){
exch(arr,min,j);
}
}
}
}
插入排序
private static void sort(int[] arr){
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < i; j++) {
if (arr[j] > arr[i]) {
exch(arr,i,j);
}
}
}
}
氣泡排序
private static void sort(int[] arr){
for (int i = arr.length - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (arr[j] > arr[j + 1]) {
exch(arr,j,j+1);
}
}
}
}
歸併排序
private static void sort(int[] arr) {
sort(arr,0,arr.length-1);
}
private static void sort(int[] arr, int lo, int hi) {
if (lo >= hi) {
return;
}
int mid = lo + ((hi - lo) >> 1);
sort(arr,lo,mid);
sort(arr,mid+1,hi);
merge(arr, lo,hi);
}
private static void merge(int[] arr, int lo, int mid,int hi) {
int[] helper = new int[hi - lo + 1];
int i = lo;
int j = mid + 1;
int index = 0;
while (i <= mid && j <= hi) {
helper[index++] = (arr[i] < arr[j] ? arr[i++] : arr[j++]);
}
while (i <= mid){
helper[index++] = arr[i++];
}
while (j <= hi){
helper[index++] = arr[j++];
}
for (int k = 0; k < helper.length; k++) {
arr[lo + k] = helper[k];
}
}
快速排序
private static void sort(int[] arr) {
if(arr == null || arr.length < 2){
return;
}
sort(arr,0,arr.length - 1);
}
private static void sort(int[] arr, int lo, int hi) {
if (lo >= hi) {
return;
}
exch(arr,lo+(int)(Math.random()*(hi-lo+1)),hi);//打亂
int[] p = partition(arr, lo, hi);
sort(arr,lo,p[0]-1);
sort(arr,p[1]+1,hi);
}
private static int[] partition(int[] arr, int lo, int hi) {
int less = lo - 1;
int more = hi;
while (lo < more){
if(arr[lo] < arr[hi]){
exch(arr,++less,lo++);
}else if (arr[lo] > arr[hi]){
exch(arr,--more,lo);
}else {
lo++;
}
}
exch(arr,more,hi);
return new int[]{less+1,more};
}
相關文章
- 排序演算法之快速排序的實現排序演算法
- python排序演算法的實現-快速排序Python排序演算法
- 【演算法】希爾排序的實現演算法排序
- 排序演算法:Java實現希爾排序排序演算法Java
- 排序演算法-Java實現快速排序演算法排序演算法Java
- 面試常問的幾個排序和查詢演算法,PHP 實現面試排序演算法PHP
- 面試必備:八種排序演算法原理及Java實現面試排序演算法Java
- #排序演算法#【5】合併排序排序演算法
- 排序圖解:js排序演算法實現排序圖解JS演算法
- 排序演算法 Java實現排序演算法Java
- 排序演算法Java實現排序演算法Java
- ForkJoin和氣泡排序組合實現的歸併排序排序
- 「金三銀四」| 手撕排序演算法(JavaScript 實現)(上)排序演算法JavaScript
- 手擼機器學習演算法 - 感知機機器學習演算法
- js實現兩種實用的排序演算法——冒泡、快速排序JS排序演算法
- 面試題目:手寫一個LRU演算法實現面試題演算法
- 九種排序演算法的 JavaScript 實現排序演算法JavaScript
- JavaScript實現的7種排序演算法JavaScript排序演算法
- 基本排序演算法的Python實現排序演算法Python
- Haskell常見排序演算法的實現Haskell排序演算法
- python排序演算法的實現-冒泡Python排序演算法
- python排序演算法的實現-插入Python排序演算法
- JavaScript實現常用排序演算法JavaScript排序演算法
- 快速排序(quicksort)演算法實現排序UI演算法
- 手擼機器學習演算法 - 嶺迴歸機器學習演算法
- 演算法-排序演算法思想及實現演算法排序
- Java中的合併排序演算法Java排序演算法
- 各類排序演算法的c++實現排序演算法C++
- python排序演算法的實現-選擇Python排序演算法
- JavaScript實現的9大排序演算法JavaScript排序演算法
- 面試中的排序演算法總結面試排序演算法
- 摯愛原生之node手擼實現伺服器伺服器
- JavaScript實現經典排序演算法JavaScript排序演算法
- 快速排序演算法C++實現排序演算法C++
- python實現希爾排序演算法Python排序演算法
- php實現4種排序演算法PHP排序演算法
- java氣泡排序演算法實現Java排序演算法
- 經典排序演算法PHP實現排序演算法PHP