算法 - 查找与内部排序 (Searching and Sorting)
本文将简要的介绍一些查找方法和排序方法,并用C++实现常用查找方法和常用排序方法。
在查看本文之前,需要一些程序语言的基础。
1 一些说明 (Description)
所有排序方法中,统一使用如下库与结构:
// Author: https://blog.csdn.net/DarkRabbit
// Sorted Dependency
#pragma once
#include <algorithm>
#include <vector>
#include <stack>
template<typename T>
struct MyItem
{
int key;
T data;
MyItem(){
key = -1; }
MyItem(const int& k) : key(k){
}
MyItem(const int& k, const T& d) : key(k), data(d){
}
};
排序数据表统一使用了std::vector<MyItem<T>>
,如果你使用静态数组MyItem<T>[]
或指针数组MyItem<T>*
,那么还要传入元素数量size
。
示例所用数据:
-
查找元素数量为
searching_size = 10
; -
查找关键字为
searching_key = { 22, 33, 14, 34, 71, 62, 55, 75, 123, 89 }
; -
排序元素数量为
sorting_size = 15
; -
排序关键字为
sorting_key = { 123, 122, 565, 22, 3, 64, 73, 44, 287, 6, 9, 83, 25, 42, 13 }
。
2 查找子目录 (Searching Sub Menu)
常用查找方法(链接逐步更新):
-
树查找 (Tree Search)
-
哈希查找(散列) (Hash Search)
3 排序子目录 (Sorting Sub Menu)
常用排序方法(链接逐步更新):
-
- 直接插入排序 (Direct Insertion Sort);
- 折半插入排序 (Binary Insertion Sort) ,也称二分插入排序;
- 希尔排序 (Shell Sort) ,也称缩小增量排序 (Diminishing Increment Sort) ;
-
- 冒泡排序(Bubble Sort),也称起泡排序;
- 快速排序(Quick Sort),也称分区排序;
-
- 简单选择排序 (Simple Selection Sort)
- 堆排序 (Heap Sort)
- 树形选择排序 (Tree Selection Sort) ,也称锦标赛排序;
-
归并排序 (Merging Sort)
-
基数排序 (Radix Sort)
4 排序性能总结 (Sort Performance Analysis)
排序方法 | 最好时间 | 最差时间 | 平均时间 | 空间 | 稳定性 |
---|---|---|---|---|---|
直接插入排序 | O(n) | O(n2) | O(n2) | O(1) | 稳定 |
折半插入排序 | O(n log2n) | O(n2) | O(n2) | O(1) | 稳定 |
希尔排序 | O(n log2n) | O(n2) | 与增量算法有关 | O(1) | 不稳定 |
冒泡排序 | O(n) | O(n2) | O(n2) | O(1) | 稳定 |
快速排序 | O(n log2n) | O(n2) | O(n log2n) | O(n log2n) 至 O(n2) | 不稳定 |
简单选择排序 | O(n2) | O(n2) | O(n2) | O(1) | 不稳定 |
堆排序 | O(n log2n) | O(n log2n) | O(n log2n) | O(1) | 不稳定 |
归并排序 | O(n log2n) | O(n log2n) | O(n log2n) | O(n) | 稳定 |
基数排序 | O(d(n+rd)) | O(d(n+rd)) | O(d(n+rd))) | O(rd+n) | 稳定 |
其中归并排序与快速排序使用的是分治法(Divide and Conquer)。
注意1:希尔排序时间复杂度和增量算法的选择有关,标准希尔增量是 O(n2),Hibbard增量时间复杂度 O(n1.5) 。
注意2:希尔增量的计算是一个复杂的问题,目前希尔增量的常用算法时间复杂度多为 O(n1.3) 到 O(n1.5) 。
5 主函数与测试 (Main Method and Testing)
5.1 查找主函数 (Searching Main Method)
// Author: https://blog.csdn.net/DarkRabbit
// Searching
#include "search_algorithm.h"
#include <algorithm>
#include <limits>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
using namespace SearchAlgorithms;
// 打印提示(输入之前的打印)
void PrintTips(const vector<int>& numList,