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

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

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

 

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

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

 

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

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

相关文章

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

【Altium】查找PCB上未连接的网络

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标: PCB设计后期检查中找出没有连接的网络 应用场景:PCB设计后期,需要检查是否所有网络都已连接布线。虽然未连接的网络会有飞线显示,但是由于布线后期整板布线密度较高,虚连,断连的网络用肉眼难以轻易发现。用DRC检查也可以找出未连接的网络,如果PCB中DRC问题较多,查找起来就不是很方便。使用PCB Filter面板来达成目的相比DRC

电脑不小心删除的文件怎么恢复?4个必备恢复方法!

“刚刚在对电脑里的某些垃圾文件进行清理时,我一不小心误删了比较重要的数据。这些误删的数据还有机会恢复吗?希望大家帮帮我,非常感谢!” 在这个数字化飞速发展的时代,电脑早已成为我们日常生活和工作中不可或缺的一部分。然而,就像生活中的小插曲一样,有时我们可能会在不经意间犯下一些小错误,比如不小心删除了重要的文件。 当那份文件消失在眼前,仿佛被时间吞噬,我们不禁会心生焦虑。但别担心,就像每个问题

(超详细)YOLOV7改进-Soft-NMS(支持多种IoU变种选择)

1.在until/general.py文件最后加上下面代码 2.在general.py里面找到这代码,修改这两个地方 3.之后直接运行即可

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

SQL Server中,always on服务器的相关操作

在SQL Server中,建立了always on服务,可用于数据库的同步备份,当数据库出现问题后,always on服务会自动切换主从服务器。 例如192.168.1.10为主服务器,12为从服务器,当主服务器出现问题后,always on自动将主服务器切换为12,保证数据库正常访问。 对于always on服务器有如下操作: 1、切换主从服务器:假如需要手动切换主从服务器时(如果两个服务

JavaWeb系列二十: jQuery的DOM操作 下

jQuery的DOM操作 CSS-DOM操作多选框案例页面加载完毕触发方法作业布置jQuery获取选中复选框的值jQuery控制checkbox被选中jQuery控制(全选/全不选/反选)jQuery动态添加删除用户 CSS-DOM操作 获取和设置元素的样式属性: css()获取和设置元素透明度: opacity属性获取和设置元素高度, 宽度: height(), widt

数据结构9——排序

一、冒泡排序 冒泡排序(Bubble Sort),顾名思义,就是指越小的元素会经由交换慢慢“浮”到数列的顶端。 算法原理 从左到右,依次比较相邻的元素大小,更大的元素交换到右边;从第一组相邻元素比较到最后一组相邻元素,这一步结束最后一个元素必然是参与比较的元素中最大的元素;按照大的居右原则,重新从左到后比较,前一轮中得到的最后一个元素不参4与比较,得出新一轮的最大元素;按照上述规则,每一轮结

PS的一些操作~持续抄袭中....

套索工具使用时移动图片——按住空格键,鼠标左键按住,拖动!