每次(例如第 i 次, i = 0,1,...,n-2) 從後面 n-i 個待排的數據元素中選出關鍵字最小的元素,做爲有序元素序列 i 個元素。
分解:
動圖:
文件:Sort.hios
#ifndef SORT_H #define SORT_H #include "Object.h" namespace DTLib { class Sort : public Object { public: template <typename T> static void Select(T array[], int len, bool min2max = true) { for (int i=0; i<len; ++i) { int min = i; for (int j=i+1; j<len; ++j) { if ((min2max ? (array[min] > array[j]) : (array[min] < array[j]))) { min = j; } } if (min != i) { Swap(array[i], array[min]); } } } private: Sort(); Sort(const Sort&); Sort &operator= (const Sort&); template <typename T> static void Swap(T &a, T &b) { T c(a); a = b; b = c; } }; } #endif // SORT_H
文件:main.cpp編程
#include <iostream> #include "Sort.h" using namespace std; using namespace DTLib; int main() { int a[5] = {3, 4, 1, 0, 2}; Sort::Select(a, 5); for (int i=0; i<5; ++i) { cout << a[i] << " "; } cout << endl; Sort::Select(a, 5, false); for (int i=0; i<5; ++i) { cout << a[i] << " "; } return 0; }
輸出:spa
0 1 2 3 4 4 3 2 1 0
當插入第 i (i>=1) 個數據元素時,前面的 V[0], V[1],...,v[i-1] 已經排好;這時,用V[i]的關鍵字與V[0], V[1],...,v[i-1]的關鍵字進行比較,找到位置後將V[i]插入,原來位置上的對象向後順移。
分解:
動圖
文件:Sort.hcode
#ifndef SORT_H #define SORT_H #include "Object.h" namespace DTLib { class Sort : public Object { public: template <typename T> static void Select(T array[], int len, bool min2max = true) // O(n*n) { for (int i=0; i<len; ++i) { int min = i; for (int j=i+1; j<len; ++j) { if ((min2max ? (array[min] > array[j]) : (array[min] < array[j]))) { min = j; } } if (min != i) { Swap(array[i], array[min]); } } } template <typename T> static void Insert(T array[], int len, bool min2max = true) // O(n*n) { for (int i=1; i<len; ++i) { T e = array[i]; int k = i; for (int j=i-1; (j>=0) && (min2max ? (e < array[j]) : (e > array[j])); --j) { array[j+1] = array[j]; k = j; } if (i != k) { array[k] = e; } } } private: Sort(); Sort(const Sort&); Sort &operator= (const Sort&); template <typename T> static void Swap(T &a, T &b) { T c(a); a = b; b = c; } }; } #endif // SORT_H
文件:main.cpp對象
#include <iostream> #include "Sort.h" using namespace std; using namespace DTLib; int main() { int a[5] = {3, 4, 1, 0, 2}; Sort::Insert(a, 5); for (int i=0; i<5; ++i) { cout << a[i] << " "; } cout << endl; Sort::Insert(a, 5, false); for (int i=0; i<5; ++i) { cout << a[i] << " "; } return 0; }
輸出:blog
0 1 2 3 4 4 3 2 1 0
- 選擇排序每次選擇未排元素中的最小元素
- 插入排序每次將第 i 個元素插入前面 i -1 個已排元素中
- 選擇排序是不穩定的排序法,插入排序是穩定的排序方法
- 選擇排序和插入排序的時間複雜度爲 O(n*n)
以上內容整理於狄泰軟件學院系列課程,請你們保護原創!排序