1. 氣泡排序
核心提煉:相鄰元素,兩兩比較,按序交換,逐趟進行,給人以水泡逐漸上浮的感覺
時間複雜度:每一趟比較的次數依次為:n-1次、n-2次…1次,所以累加求和得到複雜度為o(n^2)
空間複雜度:只需要乙個中間變數temp用於元素交換,故複雜度為o(1)
實現**:
/**
* 氣泡排序(兩兩比較--交換)
*@param arr
*/public
static
void
bubblesort(int arr)
int length = arr.length;
//如果有一趟比較的過程中沒有進行任何元素的交換,說明已經有序,不再進行後續的比較交換工作
boolean stop = true;
for(int i = 0 ; i < length - 1 ; i++)
}if(stop == true)}}
/*** 公用交換方法
*@param arr
*@param left
*@param right
*/private
static
void
swap(int arr , int left , int right)
int temp = arr[left] + arr[right];
arr[left] = temp - arr[left];
arr[right] = temp - arr[left];
}
2. 快速排序
核心提煉:選擇分界點元素,將待排序元素按照大小分為兩部分,小於分界點元素的以及大於分界點元素的,對這兩部分遞迴進行上述操作,直至所有的元素有序
背後的思想:分治法,分而治之
時間複雜度:o(nlog2(n))
空間複雜度:o(1)
注意:快速排序對於基本有序或有序的待排序陣列來說,會退化為氣泡排序,可以對中軸位置的獲取進行優化,可以避免這種極端情況
實現**:
/**
* 遞迴呼叫快排核心方法進行區域性陣列的快排
*@param arr
*@param begin
*@param end
*/public
static
void
quicksort(int arr,int begin,int end)
if(begin < end)
}/**
* 快排核心方法(獲取中軸元素位置)
*@param arr
*/public
static
intquicksortcore(int arr,int begin,int end)
int low = begin;
int high = end;
int pivot = arr[begin];
while(low < high)
arr[low] = arr[high];
while(high > low && pivot >= arr[low])
arr[high] = arr[low];
}//一趟快排之後得到的分界點位置
arr[low] = pivot;
return low;
}
3. 簡單選擇排序
核心提煉:逐趟選擇剩餘待排序元素中最小的元素,放到有序部分的尾部
時間複雜度:o(n^2)
空間複雜度:o(1)
實現**:
/**
* 簡單選擇排序(找下標--交換)
*@param arr
*/public
static
void
selectsort(int arr)
int length = arr.length;
for(int i = 0 ; i < length - 1 ; i++)
}if(min != i)
}}
4. 堆排序
核心提煉:完全二叉樹為背景,引出大頂堆和小頂堆,關鍵部分在於初次建堆和後續堆的調整
實現**:
/**
* 堆排序主方法
*@param arr
*/public
static
void
heapsort(int arr)
int len = arr.length;
//第一次將給定陣列調整為大頂堆,將陣列轉換為完全二叉樹即可得出編碼的邏輯,順序是從右向左
for(int i = len/2 - 1 ; i >= 0 ; i--)
//交換堆頂元素至陣列尾部,並對交換後的陣列進行大頂堆的調整
for(int i = len - 1 ; i > 0 ; i--)
}/**
* 堆排序-調整堆的方法
*@param arr
*@param root
*@param len
*/public
static
void
adjustmaxheap(int arr, int root, int len)
//如果根節點已大於左右子節點,則堆調整完畢
if(temp >= arr[i])
//將較大的子節點替換為父節點
arr[root] = arr[i];
//更新最後待插入的節點下標
root = i;
}//更新最後的子節點
arr[root] = temp;
}
5. 簡單插入排序
核心提煉:將待排序元素分為兩部分,左邊為有序部分(初始時只有第乙個元素),右邊為待排序部分,依次取出待排序元素與有序部分進行比較,尋找合適的插入位置進行插入
實現**:
/**
* 簡單插入排序(無序變有序--找位置插入)
*@param arr
*/public
static
void
insertsort(int arr)
int length = arr.length;
for(int i = 1 ; i < length ; i++)else
}arr[j+1] = temp;
}}
6. 希爾排序
核心提煉:簡單插入排序的改進版,採用縮小增量的插入排序,將待排序元素分段進行排序,直至最終的完全有序
**實現:
7. 歸併排序
核心提煉:完全二叉樹為背景,分治思想
實現**:
public
static
void mergesort(int arr)
int temp = new
int[arr.length];
mergesortcore(arr,temp,0,arr.length-1);
}private
static
void mergesortcore(int arr, int temp, int low, int high)
}else}}
private
static
void mergecore(int arr, int temp, int low, int mid, int high) else
index++;
}while(low <= mid)
while(begin <= high)
}
8. 基數排序
9. 桶排序
常見排序演算法的分析與實現
本文僅實現了氣泡排序 選擇排序,插入排序和快速排序,僅供參考學習。效能體驗 冒泡 選擇 插入 快排。氣泡排序 氣泡排序 最簡單的排序 穩定性 穩定 時間複雜度 o n 2 public void bubblesort int a 大的數向後移動 結束 選擇排序 公升序 選擇排序 找出最小數,然後交換...
常見的排序演算法 Java實現
最近在準備面試,回顧了一下之前學習的幾種排序演算法,並參考材料嘗試實現。現在此記錄一下,以後忘了可以回顧。直接貼上 有許多值得優化的地方 package hpp.sort created by hpp on 2017 8 4.public class sorttest insertsort arra...
java常見排序演算法
package algorithms public class arraydemo int max getmax arr arr sort2 arr int start 0 int end arr.length 1 sort3 arr,start,end print arr public stati...