常見排序演算法分析與實現(Java版)

2021-08-27 08:59:22 字數 3994 閱讀 2138

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...