算法系列——選擇排序(Selection Sort)
阿新 • • 發佈:2018-12-08
選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。 選擇排序是不穩定的排序方法。時間複雜度是O(n^2)。
在完全隨機陣列的條件下進行排序實驗。
程式碼段一:
template<typename T>
void selectionSort(T arr[], int n)
{
//arr為陣列,n為長度
//選擇排序演算法,每次選擇剩餘資料中最小的值
for (int i = 0; i < n; i++)
{
for (int j = i+1; j < n; j++)
{
if (arr[i] > arr[j])
{
swap(arr[i], arr[j]);
}
}
}
}
int main()
{
int n = 10000;
int* arr = Helper::generateRandomArray(n, 0, n);
Helper::testSort("SelectionSort", selectionSort, arr, n);
return 0;
}
實驗可知,10000資料量的隨機陣列使用以上的選擇排序,用時2.34s 100000資料量的隨機陣列使用以上的選擇排序,用時145.393s。
程式碼段二: 嘗試優化選擇排序演算法,使用一個整型變數,每次比較用該整型變數記錄最小值的索引,取代每次比較交換值的操作,減少了演算法的操作步驟,從而優化了演算法的執行時間。
template<typename T>
void selectionSortProve(T arr[], int n)
{
//arr為陣列,n為長度
//選擇排序演算法,每次選擇剩餘資料中最小的值
for (int i = 0; i < n; i++)
{
int index = i;
for (int j = i + 1; j < n; j++)
{
if (arr[j]<arr[index])
{
index = j;
}
}
swap(arr[index], arr[i]);
}
}
int main()
{
int n = 10000;
int* arr = Helper::generateRandomArray(n, 0, n);
Helper::testSort("SelectionSort", selectionSort, arr, n);
Helper::testSort("SelectionSortProve", selectionSortProve, arr, n);
return 0;
}
10000的資料量: 100000的資料量: 可知,在同等資料量下,優化後的選擇演算法大大的快於優化前的選擇演算法。
在接近有序的陣列的條件下進行排序實驗。
未優化前的程式碼在10000的資料量下實驗:
int main()
{
int n = 10000;
int* arr = Helper::generateNearlyOrderArray(n, 0, n, 10);
Helper::testSort("SelectionSort", selectionSort, arr, n);
return 0;
}
在100000的資料量100的混亂度下實驗:
優化後的程式碼在10000的資料量下實驗: 在10000的資料量100的混亂度下實驗: 可見,在接近有序的情況下,兩者的效率相差不大。