七種排序的實現
時間複雜度:最好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 ischanged b...
七種排序方法
一 快速排序 1.簡單介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的...
七種排序方法
一 快速排序 1.簡單介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的...