選擇排序和插入排序(C++實現)
公共函式,用以測試陣列相等
namespace SortCommon {
bool ArrEqual(int arr1[], int arr2[], int n) {
for (int i = 0; i < n; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
}
選擇排序
時間複雜度O(N*N), 不穩定排序
// O(N * N), 不穩定排序
void SelectSortTest(int arr[], int n) {
for (int i = 0; i < n - 1; ++i) {
int minIndex = i;
for (int j = i + 1; j < n; ++j) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
std::swap(arr[i], arr[minIndex]);
}
}
測試
void test() {
int arr1[]{9, 3, 7, 6, 5, 1, 8, 2, 4};
int arr1r[]{1, 2, 3, 4, 5, 6, 7, 8, 9};
SelectSortTest(arr1, 9);
assert(SortCommon::ArrEqual(arr1, arr1r, 9) == true);
int arr2[]{1};
int arr2r[]{1};
SelectSortTest(arr2, 1);
assert(SortCommon::ArrEqual(arr2, arr2r, 1));
int arr3[]{2, 1};
int arr3r[]{1, 2};
SelectSortTest(arr3, 2);
assert(SortCommon::ArrEqual(arr3, arr3r, 2));
return;
}
插入排序
時間複雜度O(N*N),穩定排序,如果待排序陣列基本有序,則插入排序有較高的效率,特別的,當陣列完全有序,則插入排序時間複雜度下降到O(N)
// 第一版
void InsertSortTest(int arr[], int n) {
for (int i = 1; i < n; ++i) {
for (int j = i; j > 0; --j) {
if (arr[j] < arr[j - 1]) {
std::swap(arr[j], arr[j - 1]);
}
}
}
}
// 第二版, 優化,提前終止內層迴圈,減少內層迴圈次數
void InsertSortTest(int arr[], int n) {
for (int i = 1; i < n; ++i) {
for (int j = i; j > 0 && arr[j] < arr[j - 1]; --j) {
std::swap(arr[j], arr[j - 1]);
}
}
}
// 第三版, 優化,將元素交換修改為賦值,較少元素賦值次數
void InsertSortTest(int arr[], int n) {
for (int i = 1; i < n; ++i) {
int temp = arr[i];
int j = i;
for (; j > 0 && temp < arr[j - 1]; --j) {
arr[j] = arr[j - 1];
}
arr[j] = temp;
}
}
測試
void test() {
int arr1[]{9, 3, 7, 6, 5, 1, 8, 2, 4};
int arr1r[]{1, 2, 3, 4, 5, 6, 7, 8, 9};
InsertSortTest(arr1, 9);
assert(SortCommon::ArrEqual(arr1, arr1r, 9) == true);
int arr2[]{1};
int arr2r[]{1};
InsertSortTest(arr2, 1);
assert(SortCommon::ArrEqual(arr2, arr2r, 1));
int arr3[]{2, 1};
int arr3r[]{1, 2};
InsertSortTest(arr3, 2);
assert(SortCommon::ArrEqual(arr3, arr3r, 2));
return;
}
相關文章
- 快速排序
- 劍指 Offer 29-順時針列印矩陣c++
- Python資料結構與演算法_第6節_排序 & 搜尋
- C++ 62個關鍵字的作用
- c++ 從vector擴容看noexcept應用場景
- C語言 遞迴實現二叉排序樹的插入
- C++之友元成員
- VC++儲存繪製的圖形-1
- order by改分組排序
- LeetCode C++ 204. Count Primes【Math/Hash Table】簡單
- 在python中使用BitMap排序
- c++向量變數動作.
- 2013第四屆藍橋杯省賽C++B組【第六題:三部排序】
- c++11-17 模板核心知識(十二)—— 模板的模板引數 Template Template Parameters
- (戀上資料結構筆記):歸併排序(Merge Sort)
- 【C++設計模式】組合模式
- 【技術點】計算機基礎演算法——排序 & 搜尋 & 字串匹配
- CCF CSP201903-4訊息傳遞介面(c++100)
- 「csp模擬試題202009-1」稱檢測點查詢 C/C++
- 【C++】“反轉連結串列”相關的題目