【演算法】選擇排序
阿新 • • 發佈:2018-12-13
選擇排序概述
從1-N,迴圈遍歷,每次從剩下的序列中選擇最大或者最小的元素放到剩下序列的前一個。
n個記錄的檔案的直接選擇排序可經過n-1趟直接選擇排序得到有序結果:
- 初始狀態:無序區為R[1…n],有序區為空。
- 第1趟排序 在無序區R[1…n]中選出關鍵字最小的記錄R[k],將它與無序區的第1個記錄R[1]交換,使R[1…1]和R[2…n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。 ……
- 第i趟排序 第i趟排序開始時,當前有序區和無序區分別為R[1…i-1]和R(i…n)。該趟排序從當前無序區中選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1…i]和R分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。
程式碼實現:
std::vector<int> v;
//選擇排序
template<class ForwardIt>
void selection_sort(ForwardIt begin, ForwardIt end)
{
for (ForwardIt i = begin; i != end; ++i)
{
cout << *i << " swap " << *std::min_element(i, end) << endl;
std::iter_swap(i, std:: min_element(i, end)); //每次從剩下序列中取出最小的元素
print(v);
}
}
//列印資料
void print(std::vector<int> v)
{
for (auto e : v) std::cout << e << " ";
cout << endl;
}
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution< > dist(-10, 10);
generate_n(back_inserter(v), 20, bind(dist, gen)); //初始化隨機數
std::cout << "Before sort: ";
print(v);
selection_sort(v.begin(), v.end());
std::cout << "\nAfter sort: ";
print(v);
getchar();
}
根據列印資訊我們可以清楚的看到選擇排序的過程。