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

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

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

 

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

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

 

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

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

相关文章

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

Python使用python-pptx自动化操作和生成PPT

《Python使用python-pptx自动化操作和生成PPT》这篇文章主要为大家详细介绍了如何使用python-pptx库实现PPT自动化,并提供实用的代码示例和应用场景,感兴趣的小伙伴可以跟随小编... 目录使用python-pptx操作PPT文档安装python-pptx基础概念创建新的PPT文档查看