选择排序 C++代码实现及性能分析 恋上数据结构笔记
生活随笔
收集整理的這篇文章主要介紹了
选择排序 C++代码实现及性能分析 恋上数据结构笔记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 復習梗概
- 算法思想及時間復雜度
- 選擇排序的優化
- 代碼及輸出
- 完整代碼
復習梗概
算法思想及時間復雜度
選擇排序:從未排序序列中,找出最大的那個元素,與未排序序列的末尾元素交換,
/不斷執行上述步驟(n-1輪),末尾最大元素形成有序序列(挑最小的也可以,看需求是升序還是降序)
相比冒泡排序,選擇排序無法在內循環過程中,通過比較確定前面是否已經形成有序序列,因此我認為難以優化
最好最壞平均時間復雜度均為O(n2) 空間復雜度:O(1) 屬于穩定排序
選擇排序的優化
相比冒泡排序,選擇排序無法在內循環過程中,通過比較確定前面是否已經形成有序序列,因此我認為這里難以優化
但實際上可以從另一個地方優化:即選取未排序序列最大值這個過程,如果用堆完成的話,時間復雜度只有O(logn)(主要是下濾),整體復雜度O(nlogn)
因此,優化后的選擇排序算法 即為 堆排序
詳情請見下一篇文章:堆排序
代碼及輸出
void selectionSort(vector<int> &array) { //外循環控制未排序序列末尾指針,以及重置最大值索引,以及調換最大值與末尾元素for (int end = array.size() - 1; end > 0; end--) // end記錄當前未排序序列的末尾{int maxNumIndex = 0;for (int i = 1; i <= end; i++){ //注意這里:選擇排序:每次內循環取出最大值(初始值為數組第一個元素)與后面每一位元素比較,若找到更大的,則更新最大值所在索引if (array[maxNumIndex] <= array[i]){maxNumIndex = i;}} //內循環結束,記錄當前未排序序列的最大值的索引int temp = array[maxNumIndex]; //調換未排序序列的最大值元素與末尾元素位置array[maxNumIndex] = array[end];array[end] = temp;} } 輸入數組: 6 9 3 1 2 0 8 29 15 11 10 選擇排序基礎版 找到最大值:29 與10交換 6 9 3 1 2 0 8 10 15 11 29 找到最大值:15 與11交換 6 9 3 1 2 0 8 10 11 15 29 找到最大值:11 與11交換 6 9 3 1 2 0 8 10 11 15 29 找到最大值:10 與10交換 6 9 3 1 2 0 8 10 11 15 29 找到最大值:9 與8交換 6 8 3 1 2 0 9 10 11 15 29 找到最大值:8 與0交換 6 0 3 1 2 8 9 10 11 15 29 找到最大值:6 與2交換 2 0 3 1 6 8 9 10 11 15 29 找到最大值:3 與1交換 2 0 1 3 6 8 9 10 11 15 29 找到最大值:2 與1交換 1 0 2 3 6 8 9 10 11 15 29 找到最大值:1 與0交換 0 1 2 3 6 8 9 10 11 15 29 算法用時:(微秒) [AlgoTime: 16004 us]完整代碼
#include <iostream> #include <vector> #include "MeasureAlgoTime.hpp" using namespace std;//! 選擇排序:從未排序序列中,找出最大的那個元素,與未排序序列的末尾元素交換, //! 不斷執行上述步驟(n-1輪),末尾最大元素形成有序序列(挑最小的也可以,看需求是升序還是降序) //! 相比冒泡排序,選擇排序無法在內循環過程中,通過比較確定前面是否已經形成有序序列,因此我認為難以優化 //! 堆排序 //! 最好最壞平均時間復雜度:O(n2) 空間復雜度:O(1) 屬于穩定排序void vectorPrint(vector<int> &array) {for (int i = 0; i < array.size(); i++){cout << array[i] << ' ';}cout << endl; }void selectionSort(vector<int> &array) { //外循環控制未排序序列末尾指針,以及重置最大值索引,以及調換最大值與末尾元素for (int end = array.size() - 1; end > 0; end--) // end記錄當前未排序序列的末尾{int maxNumIndex = 0;for (int i = 1; i <= end; i++){ //注意這里:選擇排序:每次內循環取出最大值(初始值為數組第一個元素)與后面每一位元素比較,若找到更大的,則更新最大值所在索引if (array[maxNumIndex] <= array[i]){maxNumIndex = i;}} //內循環結束,記錄當前未排序序列的最大值的索引cout << "找到最大值:" << array[maxNumIndex] << " "<< "與" << array[end] << "交換" << endl;int temp = array[maxNumIndex]; //調換未排序序列的最大值元素與末尾元素位置array[maxNumIndex] = array[end];array[end] = temp;vectorPrint(array);} }int main() {Tools::Time::AlgoTimeUs time1;Tools::Time::AlgoTimeUs time2;Tools::Time::AlgoTimeUs time3;vector<int> array;array = {6, 9, 3, 1, 2, 0, 8, 29, 15, 11, 10};vector<int> array2 = array;vector<int> array3 = array;time1.start();vectorPrint(array);cout << "選擇排序基礎版" << endl;selectionSort(array);cout << "算法用時:(微秒)";time1.printElapsed();cout << ' ' << endl;return 0; } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的选择排序 C++代码实现及性能分析 恋上数据结构笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021-10-21 二叉堆 恋上数据结
- 下一篇: 堆排序 C++代码实现及思想 排序过程输