![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
xg_nature
这个作者很懒,什么都没留下…
展开
-
手撕代码系列7 -- 堆排序
原理构建最大堆,每次把极值移到未排序数组的最后一位,直至全部有序手撕代码void down(vector<int> &vec,int l,int j) //重建大顶堆{ //排序 [l,r] int i = l; int temp = vec[i]; for(i = 2*i+1;i<=r;i = 2*i+1) { if(i+1<=r && vec[i]<vec[i+1])原创 2020-09-02 17:03:59 · 165 阅读 · 0 评论 -
手撕代码系列6 -- 快速排序
原理找到一个值,使得数组左边的值全部小于它,数组右边的值全部大于它;手撕代码void quickSort(vector<int> &vec,int l,int r){ //排序边界[l,r]if(l<r){ int i = l,j = r; int temp = vec[i]; while(i<j) { whie(i<j && j>temp) {原创 2020-09-02 16:42:58 · 161 阅读 · 0 评论 -
手撕代码系列5--希尔排序
原理希尔排序,是对插入排序的一种改进,先分组有序,再全体有序;手撕代码void shellSort(vector<int> &vec){ int len = vec.size(); int j = 0; int gap = len;//分组 do{ gap = gap/2;//这个策略可以修改,改善时间复杂度 for(int i = 0;i<gap;i++) //每一个分组排原创 2020-09-02 16:30:19 · 111 阅读 · 0 评论 -
手撕代码系列4 --直接插入排序
原理将数组分为两个部分,有序数组和无序数组,每一轮将无序数组里面的元素插入有序数组中手撕代码系列void insertSort(vector<int> &vec){ int len = vec.size(),ele; for(int i = 1;i<len;++i)//从下标1开始,插入 { ele = vec[i]; for(int j = i-1;j>=0;j--) {原创 2020-09-02 10:57:30 · 92 阅读 · 0 评论 -
手撕代码系列3 -- 快速排序
原理1.从数组中选择一个基准值2.比基准值小的放在左边,比基准值打的放在右边,最后退出的时候,基准值则位于数组中间3.对基准值左边进行排序,对基准值右边进行排序.手撕代码void quickSort(vector<int> &vec,int start,int end){ if(start<end) { int i = start, j =end; int ele = vec[start]; w原创 2020-09-02 10:39:45 · 98 阅读 · 0 评论 -
手撕代码系列2--冒泡排序
原理每一次遍历,将未排序数组的最大值放在未排序数组的最后手撕代码void BubbleSort(vector<int> &vec){ int len = vec.size(); bool flag = false; for(int i = 0;i<len-1;i++)//对n-1个元素排序 { for(int j = 1;j<len-i;j++) { flag = fals原创 2020-09-02 10:20:27 · 157 阅读 · 0 评论 -
手撕代码系列1--选择排序
原理从未排序区域选择一个最小值(最大值)放到开始位置(已排序的最后位置或者未排序的开始位置)。手撕代码void BubbleSort(vector<int> &vec){ /*数组长度*/ int len = vec.size(); for(int i = 0;i<len-1;++i) { int index = i;//当前未排序开始位置 for(int j = i+1;j<len;j++){原创 2020-09-02 10:05:16 · 71 阅读 · 0 评论 -
leetcode LC146 最长不重复子串
题目:从一个字符串中找到一个连续子串,该子串中任何两个字符不能相同,求子串的最大长度并输出一条最长不重复子串。思路:利用map表hashtable[256]来保存出现过的字符,然后从头开始遍历字符串,1、如果当前字符ch已经出现过(hashtable[ch]==1),则表示一个局部最长不重复子串已经出现:此时更新子串长度,同时更新最长子串的起始位置start。同时将start到重复字符ch之间的map表重置为0(表示没有出现过)然后从ch的下个字符作为新的子串的开始;2、如果当前原创 2020-08-31 19:47:40 · 108 阅读 · 0 评论 -
leetcode每日一道(6):求给定的二叉树的后序遍历
1. 题目题目描述求给定的二叉树的后序遍历。例如:给定的二叉树为{1,#,2,3},1↵ ↵ 2↵ /↵ 3↵返回[3,2,1].备注;用递归来解这道题太没有新意了,可以给出迭代的解法么?2. 思路2.1 递归我们先考虑一下递归的思路,从三种遍历来看(前序、中序、后序),都是可以通过递归来实现的,只需要不断调用自身函数,但是问题就是带来的空间复杂度太高。因此最好的方案是迭代。2.2 迭代如果是前序遍历,我们的顺序是根节点,左节点,右节点。如果我们用一个栈来实现,可以这样考转载 2020-08-30 19:54:11 · 107 阅读 · 0 评论