插入、选择、冒泡、堆排序、快排、归并排序算法及二叉查找树查找、插入、删除操作

本文主要是介绍插入、选择、冒泡、堆排序、快排、归并排序算法及二叉查找树查找、插入、删除操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

针对排序方法的学习总结:

 

排序方法中稳定与不稳定的是指待排序集合中存在多个相同关键字相同的数据元素,经过排序后,这些数据元素的相对次序保持不变,即为稳定,否则不稳定。

内排序与外排序是指按照排序过程中数据存储的存储设备的不同。内排序指被排序的数据元素全部存放在计算机的内存之中,并且在内存中调整数据元素的相对位置。外排序指数据元素主要存放在外存储器中,借助于内存储器逐步调整数据元素之间的相对位置。

 

以下各种算法代码实现,必须要一气呵成。熟能生巧,多写多练。所给方法可能并不全面,所以需要时常更新。

1、插入排序:每次将一个待排序的数据元素,按其关键字大小,插入到前面已经排好序的一组数据元素中的适当位置,直到所有的数据元素全部插入为止。

顺序存储实现:

//-----------------------------------------------------
//SimpleInsertSort
//-----------------------------------------------------
void simpleInsertSort(int a[], int size) {int k;int tmp;for (int j = 1; j < size; ++j) {tmp = a[j];for (k = j - 1; tmp < a[k] && k >= 0; --k)a[k + 1] = a[k];//从后住前移a[k] = tmp;}
}

链表存储实现:

Struct ListNode{Int val;ListNode *next;ListNode(int x):val(x),next(nullptr){}
};
ListNode* insertSortList(ListNode* head){ListNode* dummy=new ListNode(INT_MIN);ListNode* cur=head;ListNode* pre=dummy;While(cur!=nullptr){ListNode* next=cur->next;pre=dummy;while(pre->next!=nullptr&&pre->next->val<cur->val)pre=pre->next;cur->next=pre->next;pre->next=cur;cur=next;
}ListNode* pHead=dummy->next;Delete dummy;Return pHead;
}

2、选择排序:从n个元素中选出关键字最小的元素,再从剩下的n-1个元素中选出n-1个元素中关键字最小的元素,依此类推,直至序列中最后只剩下一个元素为止。

顺序存储实现:

//-----------------------------------------------------
//SimpleSelectSort
//-----------------------------------------------------
void simpleSelectSort(int a[], int size) {int i, j, maxk;for (i = 0; i < size-1 ; ++i) {//因为选完倒数每二个数后,倒数第一个数一定是最大的maxk = i;for (j = i + 1; j < size ; ++j)if (a[j] < a[maxk])maxk = j;swap(a[maxk], a[i]);}
}

冒泡排序:

//-----------------------------------------------------
//bubbleSort
//-----------------------------------------------------
void bubbleSort(int a[], int size) {bool flag = 0;for (int i = 0; i < size - 1; ++i) {//一共是size-1次起泡for (int j = 0; j < size - 1 - i; ++j) {if (a[j] > a[j + 1]) {swap(a[j], a[j + 1]);flag = 1;}}if (!flag)break;}
}

3、堆排序(此处实现的是最小堆排序)

//-----------------------------------------------------
//HeapSort
//-----------------------------------------------------
void heapFixup(int a[], int i) {//向上过滤int tmp = a[i];int f = i / 2 - 1;while (f >= 0) {if (tmp > a[f])break;a[i] = a[f];i = f;f = i / 2 - 1;}a[i] = tmp;
}
void heapInsert(int a[], int n,int val) {a[n] = val;heapFixup(a, n);
}void heapFixdown(int a[], int i, int n) {//向下过滤int tmp = a[i];int s = 2 * i + 1;while (s <= n) {if (s + 1 <= n&&a[s] > a[s + 1])++s;if (tmp < a[s])break;a[i] = a[s];i = s;s = 2 * i + 1;}a[i] = tmp;
}
void heapDelete(int a[], int n) {swap(a[0], a[n]);heapFixdown(a, 0, n-1);
}
//堆排序的关键是实现向下过滤函数
void heapSort(int a[], int n) {for (int i = n / 2 - 1; i >= 0; --i)heapFixdown(a, i, n);
}

4、快排

//-----------------------------------------------------
//quickSort
//-----------------------------------------------------
int partition(int a[], int start, int end) {int tmp = a[start];int low = start, high = end;do {while (a[high] >= tmp)--high;if (low < high&&a[high]<tmp) {a[low] = a[high];++low;}while (a[low] <= tmp)++low;if (low<high&&a[low]>tmp) {a[high] = a[low];--high;}} while (low != high);return low;
}
void quickSort(int a[], int start, int end) {if (start == end)return;int mid = partition(a, start, end);quickSort(a, start, mid - 1);quickSort(a, mid + 1, end);
}

5、归并排序

//-----------------------------------------------------
//mergeSort
//-----------------------------------------------------
void merge(int a[], int start, int mid, int end) {int i = start, j = mid + 1,k=0;int *tmp = new int[end - start + 1];while (i <= mid&&j <= end) {if (a[i] < a[j]) {tmp[k++] = a[i++];}elsetmp[k++] = a[j++];}while (i <= mid) tmp[k++] = a[i++];while (j <= end) tmp[k++] = a[j++];for (k = 0, i = start; i <= end; ++k, ++i)a[i] = tmp[k];delete[] tmp;
}
void mergeSort(int a[], int start, int end) {if (start == end)return;int mid = (start + end) / 2;mergeSort(a, start, mid);mergeSort(a, mid + 1, end);merge(a, start, mid, end);
}

6、二叉查找树(查找、插入、删除)

#include<iostream>using namespace std;struct TreeNode {int val;TreeNode* left, *right;TreeNode(int x) :val(x), left(nullptr), right(nullptr) {}
};/*二叉查找树的查找实现
*/
bool BST_find(TreeNode* root, int& val) {if (!root)return false;if (root->val > val)BST_find(root->left, val);else if (root->val < val)BST_find(root->right, val);elsereturn true;
}/*二叉查找树的插入实现
*/
void BST_insert(TreeNode* root, int &val) {if (!root) {root = new TreeNode(val);return;}if (root->val > val)BST_insert(root->left, val);else if (root->val < val)BST_insert(root->right, val);else {//cout << "This value has been existed in the tree" << endl;return;}
}/*二叉查找树的删除实现
*/
void BST_remove(TreeNode* root, int &val) {if (!root) {//cout << "There is no this value in the tree" << endl;return;}if (root->val > val)BST_remove(root->left, val);else if (root->val < val)BST_remove(root->right, val);else {if (root->right&&root->left) {//处理有两个儿子的节点TreeNode* tmp=root->left;//在左子树中找最大值节点while (!tmp->right)tmp = tmp->right;root->val = tmp->val;BST_remove(tmp, tmp->val);}else {//处理一个儿子或没有儿子的节点TreeNode* tmp = root;root = root->left ? root->left : root->right;delete tmp;}}
}

 

这篇关于插入、选择、冒泡、堆排序、快排、归并排序算法及二叉查找树查找、插入、删除操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/935633

相关文章

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad