算法 - 查找与内部排序 (Searching and Sorting)

本文详细介绍了各种查找方法(顺序查找、二分查找等)和排序方法(插入排序、快速排序等),并提供了C++实现。文中还讨论了排序性能,包括归并排序和快速排序的分治策略,以及希尔排序的时间复杂度。
摘要由CSDN通过智能技术生成

算法 - 查找与内部排序 (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)

常用查找方法(链接逐步更新):


3 排序子目录 (Sorting Sub Menu)

常用排序方法(链接逐步更新):

  • 插入排序 (Insertion Sort)

    • 直接插入排序 (Direct Insertion Sort);
    • 折半插入排序 (Binary Insertion Sort) ,也称二分插入排序;
    • 希尔排序 (Shell Sort) ,也称缩小增量排序 (Diminishing Increment Sort) ;
  • 交换排序 (Swap Sort)

    • 冒泡排序(Bubble Sort),也称起泡排序;
    • 快速排序(Quick Sort),也称分区排序;
  • 选择排序 (Selection 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, 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值