数据结构与算法
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 · 144 阅读 · 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 · 151 阅读 · 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 · 99 阅读 · 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 · 84 阅读 · 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 · 94 阅读 · 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 · 138 阅读 · 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 · 66 阅读 · 0 评论 -
leetcode LC146 最长不重复子串
题目: 从一个字符串中找到一个连续子串,该子串中任何两个字符不能相同,求子串的最大长度并输出一条最长不重复子串。 思路: 利用map表hashtable[256]来保存出现过的字符,然后从头开始遍历字符串, 1、如果当前字符ch已经出现过(hashtable[ch]==1),则表示一个局部最长不重复子串已经出现: 此时更新子串长度,同时更新最长子串的起始位置start。 同时将start到重复字符ch之间的map表重置为0(表示没有出现过)然后从ch的下个字符作为新的子串的开始; 2、如果当前原创 2020-08-31 19:47:40 · 96 阅读 · 0 评论 -
leetcode每日一道(6):求给定的二叉树的后序遍历
1. 题目 题目描述 求给定的二叉树的后序遍历。 例如: 给定的二叉树为{1,#,2,3}, 1↵ ↵ 2↵ /↵ 3↵ 返回[3,2,1]. 备注;用递归来解这道题太没有新意了,可以给出迭代的解法么? 2. 思路 2.1 递归 我们先考虑一下递归的思路,从三种遍历来看(前序、中序、后序),都是可以通过递归来实现的,只需要不断调用自身函数,但是问题就是带来的空间复杂度太高。因此最好的方案是迭代。 2.2 迭代 如果是前序遍历,我们的顺序是根节点,左节点,右节点。如果我们用一个栈来实现,可以这样考转载 2020-08-30 19:54:11 · 101 阅读 · 0 评论