七種排序的實現

2021-07-15 08:19:44 字數 3404 閱讀 5040

時間複雜度:最好o(n),平均和最壞情況o(n2)

空間複雜度:o(1)

穩定排序

原理:從第乙個元素開始,依次比較相鄰兩個元素,如果前者比後者大,那麼就交換者兩個元素,然後處理下一組,依次類推,直到排序完成。

實現:

public

void

bubblesort(int arr)

}if(!ischanged) break; //本次沒有發生交換,說明已經排好序了

}}

時間複雜度:最好、平均和最壞情況o(n2)

空間複雜度:o(1)

不是穩定排序

原理:從第乙個元素開始,每次逐一掃瞄選擇未排序部分的最小值,排在已排序部分後面,然後從下乙個位置開始,繼續進行相同的操作,直到排序完成。

實現:

/**

* 選擇排序

*/public

static

void

sort(int arr)

}if (minindex != i)

}}

時間複雜度:最好、平均情況o(nlogn),最壞情況o(n2)

空間複雜度:平均情況o(logn),最壞情況o(n)

不是穩定排序

原理:每次選擇乙個數,將陣列按照這個數分成左右兩個部分,右邊的比它大,左邊的比他小然後對左右兩部分分別進行同樣的操作,直到陣列排序完成

實現:

public

static

void

sort(int arr)

/** *@param arr 排序的陣列

*@param start 開始位置

*@param end 結束位置

*/private

static

void

sortcore(int arr, int start, int end)

if (poiv >= start && poiv < end)

}private

static

intpartion(int arr, int start, int end)

while (start < end && arr[start] < tmp) start++;

if (start < end)

}arr[start] = tmp;

return start;

}

時間複雜度:最好、平均和最壞情況o(nlogn)

空間複雜度:o(n)

穩定排序

原理:首選將要排序的陣列對半分,對各自部分進行排序。每部分繼續進行相同的操作,直至最底層。然後合併兩個相鄰的部分,直到所有元素都排序完成

實現:

public

static

void

sort(int arr)

/** * 歸併排序核心實現

*@param arr 排序的陣列

*@param copy 輔助空間

*@param start 開始位置

*@param end 結束位置

*@param offset 索引相對於原陣列的偏移

*/private

static

void

sortcore(int arr, int copy, int start, int end)

int mid = (end - start) / 2 + start;

//分成兩部分,遞迴

sortcore(arr, copy, start, mid);

sortcore(arr, copy, mid + 1, end);

//合併兩個部分,將合併結果存入

int forward = mid;

int behand = end;

int last = end;

while (forward >= start && behand > mid)else

}while (forward >= start)

while (behand > mid)

//拷貝到copy陣列

for (int i = start; i <= end; i++)

}

時間複雜度:最好o(n),平均和最外情況o(n2)

空間複雜度:o(1)

穩定排序

原理:從陣列第乙個元素開始,依次比較前面已經排序的部分,插入合適的位置,前面排序部分比當前值大的部分向後移動乙個。

實現:

public

static

void

sort(int arr)

arr[j] = tmp; |

}}

時間複雜度:平均情況o(n1.25)

空間複雜度:o(1)

不是穩定排序

原理:將無序陣列分割為若干個子串行,子串行不是逐段分割的,而是相隔特定的增量的子串行,對各個子串行進行插入排序;然後再選擇乙個更小的增量,再將陣列分割為多個子串行進行排序……最後選擇增量為1,即使用直接插入排序,使最終陣列成為有序。

實現:

public

static

void

sort(int arr)

arr[j] = tmp;

}adder /= 2;

}}

時間複雜度:最好、平均和最壞情況均為o(nlogn)

空間複雜度:o(1)

不是穩定排序

原理:建立初始堆,從最後乙個非葉結點開始,往前遍歷,判斷以該節點的開始的堆是否是符合,不符合則調整需要建立大頂堆,每次將子節點中較大地乙個數往上移動,直到葉結點(堆:結點n的父節點為(n-1)/ 2,其左右子節點為2*n+1和2*n+2大根堆為根結點的值大於等於左右子結點的值),然後依次將堆頂值與為排序的最後乙個值交換,然後調整前面的值為大頂堆,每次將最大的值排好序。

實現:

/**

* 堆排序

*/public

static

void

sort(int arr)

//依次將堆頂值與為排序的最後乙個值交換,然後調整前面的值為大頂堆

for (int i = arr.length - 1; i >= 1; i--)

}/**

* 調整為大頂堆

*@param arr

*@param i 以i為堆的堆頂

*@param last 堆頂的最後乙個結點的索引

*/private

static

void

adjustheap(int arr, int i, int last)

arr[i] = tmp; //最後確定的位置,沒有子結點或者比子結點的值大;

}

七種排序的實現

七種排序的實現 時間複雜度 最好o n 平均和最壞情況o n2 空間複雜度 o 1 穩定排序 原理 從第乙個元素開始,依次比較相鄰兩個元素,如果前者比後者大,那麼就交換者兩個元素,然後處理下一組,依次類推,直到排序完成。實現 public void bubblesort int arr if isc...

七種排序方法

一 快速排序 1.簡單介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的...

七種排序方法

一 快速排序 1.簡單介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的...