適合面試手擼的排序演算法實現
前言
各種排序的實現方式很多,每種排序針對資料狀態,時間複雜度等等這裡不講。只給程式碼。起因大概是我當時想找一篇好點的彙總文章找不到。適合手擼。例如考官讓你手擼一下快排之類的。
交換
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};
}
相關文章
- 面試必備:八種排序演算法原理及Java實現面試排序演算法Java
- 面試常問的幾個排序和查詢演算法,PHP 實現面試排序演算法PHP
- 面試題目:手寫一個LRU演算法實現面試題演算法
- 排序演算法之快速排序的實現排序演算法
- 排序演算法-Java實現快速排序演算法排序演算法Java
- 【演算法】希爾排序的實現演算法排序
- 做好面試的準備之—常見面試題(適合初級、中級的面試者)面試題
- 排序演算法:Java實現希爾排序排序演算法Java
- 排序演算法Java實現排序演算法Java
- 排序演算法 Java實現排序演算法Java
- 分享一份適合練手的介面測試實戰專案
- 面試官:手撕十大排序演算法,你會幾種?面試排序演算法
- ForkJoin和氣泡排序組合實現的歸併排序排序
- 「金三銀四」| 手撕排序演算法(JavaScript 實現)(上)排序演算法JavaScript
- 對於JavaScript實現排序演算法的一些其他測試JavaScript排序演算法
- 九種排序演算法的 JavaScript 實現排序演算法JavaScript
- JavaScript實現的7種排序演算法JavaScript排序演算法
- 【程式設計師面試演算法】快速排序,9種主流程式語言實現!程式設計師面試演算法排序
- JavaScript實現常用排序演算法JavaScript排序演算法
- 資料結構和演算法面試題系列—排序演算法之快速排序資料結構演算法面試題排序
- 資料結構和演算法面試題系列—排序演算法之基礎排序資料結構演算法面試題排序
- python實現氣泡排序、插入排序以及快速排序演算法Python排序演算法
- php實現4種排序演算法PHP排序演算法
- JavaScript實現經典排序演算法JavaScript排序演算法
- 排序演算法-C語言實現排序演算法C語言
- 經典排序演算法PHP實現排序演算法PHP
- 快速排序演算法C++實現排序演算法C++
- python實現希爾排序演算法Python排序演算法
- java氣泡排序演算法實現Java排序演算法
- Java中的合併排序演算法Java排序演算法
- Java實現氣泡排序和插入排序演算法Java排序演算法
- 排序演算法:堆排序的實現和時間複雜度分析排序演算法時間複雜度
- python實現常見的五種排序演算法Python排序演算法
- 幾種常用的排序演算法之JavaScript實現排序演算法JavaScript
- 用 Java 實現的八種常用排序演算法Java排序演算法
- 幾種排序演算法的原理以及 Java 實現排序演算法Java
- 八大排序演算法的python實現排序演算法Python
- 摯愛原生之node手擼實現伺服器伺服器