選擇排序和插入排序(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;
}
相關文章
- php實現 氣泡排序,插入排序,選擇排序PHP排序
- 桶排序 選擇,插入排序排序
- 圖解選擇排序與插入排序圖解排序
- go 實現氣泡排序和插入排序Go排序
- 用JS實現氣泡排序和插入排序JS排序
- 選擇排序(python)實現排序Python
- 排序演算法(氣泡排序,選擇排序,插入排序,希爾排序)排序演算法
- PHP 常見4種排序 氣泡排序、選擇排序、插入排序、快速排序PHP排序
- JavaScript實現:插入排序!!!JavaScript排序
- Java實現氣泡排序和插入排序演算法Java排序演算法
- 利用java實現插入排序、歸併排序、快排和堆排序Java排序
- 選擇排序和快速排序排序
- 重學資料結構和演算法(四)之氣泡排序、插入排序、選擇排序資料結構演算法排序
- 用JavaScript實現插入排序JavaScript排序
- 希爾排序使用直接插入排序、二分插入排序的C++程式碼實現演算法排序C++演算法
- Python八大演算法的實現,插入排序、希爾排序、氣泡排序、快速排序、直接選擇排序、堆排序、歸併排序、基數排序。Python演算法排序
- 選擇排序和氣泡排序排序
- 反射,hashlib模組,正則匹配,冒泡,選擇,插入排序反射排序
- Java實現二元選擇排序Java排序
- 【小小前端】前端排序演算法第一期(氣泡排序、選擇排序、插入排序)前端排序演算法
- 七、排序,選擇、冒泡、希爾、歸併、快速排序實現排序
- 氣泡排序和選擇排序詳解排序
- 氣泡排序和選擇排序流程圖排序流程圖
- 改進的氣泡排序和選擇排序(雙向冒泡/一次遍歷選出最大和最小的選擇排序)C語言實現排序C語言
- 冒泡、選擇、快排、插入排序—效能簡單測試/rand()邊界值——c++資料結構排序C++資料結構
- 排序演算法 - 氣泡排序和選擇排序排序演算法
- python實現氣泡排序、插入排序以及快速排序演算法Python排序演算法
- 選擇排序排序
- 插入排序排序排序
- 三種插入排序 直接插入排序,折半插入排序,希爾排序排序
- 堆排序(實現c++)排序C++
- 堆排序c++實現排序C++
- C#實現——十大排序演算法之選擇排序C#排序演算法
- 排序演算法 - 快速插入排序和希爾排序排序演算法
- 選擇排序法排序
- 01選擇排序排序
- Java 選擇排序Java排序
- js選擇排序JS排序