数据结构篇
ndzjx
喜欢编程
展开
-
十三:奇偶数排序(快排也可以稳定的思路)
1:类似快速排序,一头一尾指针往中间扫描// 判断是否为奇数bool IsOddNumber(int data){ return (data & 1) == 1;}// 奇数偶数互换void OddEvenSort(int *pData, unsigned int length){ if (pData == NULL || length == 0) ...原创 2018-12-06 18:01:50 · 832 阅读 · 0 评论 -
编程之美11:二叉树中节点的最大距离
struct{ NODE *pLeft; Node *pRight; int nMaxLeft; // 左子树中的最长距离 int nMaxRight; // 右子树中的最长距离 char chValue; // 该节点的值};int nMaxLen = 0;// 寻找树中最长的两段距离void FindMaxLen(NODE *pRoo...原创 2018-11-27 11:11:42 · 113 阅读 · 0 评论 -
编程之美10:计算字符串的相似度
我们并不在乎两个字符串变得相等之后的字符串是怎样的,所以1.一步操作之后,再将A[2,…,lenA]和B[1,…,lenB]变成相同的字符串。2.一步操作之后,再将A[1,…,lenA]和B[2,…,lenB]变成相同的字符串。3.一步操作之后,再将A[2,…,lenA]和B[2,…,lenB]变成相同的字符串。int CalculateStringDistance(string s...原创 2018-11-27 11:09:55 · 202 阅读 · 0 评论 -
编程之美9:数组循环位移
1:RightShift(int *arr, int N, int K){ K %= N; while (K--) { int t = arr[N - 1]; for (int i = N - 1; i > 0; i--) { arr[i] = arr[i - 1]; } ...原创 2018-11-23 22:34:38 · 135 阅读 · 0 评论 -
编程之美8:求数组的子数组之和的最大值
1:int MaxSum(int *A, int n){ int maximum = -INF; int sum; for (int i = 0; i < n; i++) { sum = 0; for (int j = i; j < n; j++) { sum += A[j];...原创 2018-11-23 22:32:53 · 285 阅读 · 0 评论 -
编程之美7:最大公约数
1:辗转相除法f(x,y) = f(y, x%y);int gcd(int x, int y){ return (!y) ? x : gcd(y, x % y);}2:对于大整数,取模运算非常昂贵。f(x, y) = f(x-y, y);BigInt gcd(BigInt x, BigInt y){ if (x < y) { ...原创 2018-11-23 22:30:58 · 174 阅读 · 0 评论 -
编程之美6:十进制 1到N,之间出现1的个数
1:ULONGLONG Count1InAInteger(ULONGLONG n){ ULONGLONG iNum = 0; while (n != 0) { iNum += (n % 10 == 1) ? 1 : 0; n /= 10; } return iNum;}ULONGLONG f(ULONGLONG n...原创 2018-11-23 22:23:50 · 197 阅读 · 0 评论 -
编程之美5:找一堆ID中,数量超过一半的那个ID
排序费时间,不用排序的方法如下:(如果每次删除2个不同的ID)Type Find(Type *ID, int N){ Type candidate; int nTimes, i; for (i = nTimes = 0; i < N; i++) { if (nTimes == 0) { candid...原创 2018-11-23 22:18:57 · 143 阅读 · 0 评论 -
编程之美4:阶乘相关
1)N!末尾有多少个零N! = K * 10^MN! = 2^X * 3^Y * 5^ZM = min(X,Z) 其中X >= Z,因为能被2整除的数出现的频率比能被5整除的数高很多。于是只需计算因式分解中5的指数。1:ret = 0;for (int i = 1; i <= N; i++){ j = i; while (j % 5 == 0) ...原创 2018-11-23 22:14:32 · 326 阅读 · 0 评论 -
编程之美3:求二进制数中1的个数
1:int Count(BYTE v){ int num = 0; while (v) { if (v % 2 == 1) { num++; } v = v / 2; } return num;}//-------------------------------...原创 2018-11-23 22:10:34 · 138 阅读 · 0 评论 -
一:字符串字母的包含
// 位运算方法的实质是用一个整数代替了散列表bool StringContain(string &a, string &b){ int hash = 0; for (int i = 0; i < a.length(); ++i) { hash |= (1 << (a[i] - 'A')); } for...原创 2018-12-05 16:49:03 · 249 阅读 · 0 评论 -
二:字符串的全排列
1:递归实现void CalcAllPermutation(char *perm, int from, int to){ if (to <= 1) { return; } if (from == to) { for (int i = 0; i <= to; i++) { ...原创 2018-12-05 16:50:11 · 108 阅读 · 0 评论 -
三:字符串转化成整数
int StrToInt(const char *str){ static const int MAX_INT = (int)((unsigned)~0 >> 1); static const int MIN_INT = -(int)((unsigned)~0 >> 1) - 1; unsigned int n = 0; // 判断输入是...原创 2018-12-05 16:51:36 · 89 阅读 · 0 评论 -
十二:判断单链表是否有环
快慢指针// 判断链表中是否有环bool IsExitLoop(LinkList *head){ LinkList *pSlow = head; LinkList *pFast = head; while (pFast != NULL && pFast->next != NULL) { pSlow = pSlow->...原创 2018-12-06 17:41:34 · 111 阅读 · 0 评论 -
十一:字符串编辑距离
原串(增删改)变成目标串// dp[i][j]表示源串S[0..i]和目标串target[0..j]的编辑距离int EditDistance(char *S, char *T){ int srcLength = strlen(S); int targetLength = strlen(T); int i, j; // 边界dp[i][0] = i, dp[...原创 2018-12-06 17:41:23 · 138 阅读 · 0 评论 -
十:最大连续乘积子数组
1:蛮力轮询double MaxProductSubstring(double *a, int length){ double maxResult = a[0]; for (int i = 0; i < length; i++) { double x = 1; for (int j = i; j < length; j++)...原创 2018-12-05 17:01:19 · 388 阅读 · 0 评论 -
九:字符串的查找(P在S中的位置)kmp
1:蛮力匹配方法int ViolentMatch(char *S, char *P){ int sLen = strlen(S); int pLen = strlen(P); int i = 0; int j = 0; while (i < sLen && j < pLen) { if (S[i] =...原创 2018-12-05 16:59:53 · 471 阅读 · 0 评论 -
八:跳台阶问题
一个台阶共n级,如果一次可以跳1级,也可以跳2级,求总共有多少种跳法。1:递归 如果台阶只有1级,则只有一种跳法,如果有2级,则有两种跳法(一种是分两次跳,每次跳1级,另一种是一次跳2级)long long Fibonacci(unsigned int n){ int result[3] = {0, 1, 2}; if (n <= 2) { ...原创 2018-12-05 16:58:45 · 193 阅读 · 0 评论 -
七:寻找和为定值的多个数
1:n问题转换为n-1问题list<int> list1;void SumOfkNumber(int sum, int n){ // 递归出口 if (n <= 0 || sum <= 0) { return; } // 输出找到的结果 if (sum == n) { // 反转...原创 2018-12-05 16:57:51 · 287 阅读 · 0 评论 -
六:寻找和为定值的两个数
可以通过散列映射,或者排序夹逼解决。排序夹逼:void TwoSum(int a[], unsigned int length, int sum){ // sort(s, s+n); 如果数组非有序,排序O(nlogn) int begin = 0; int end = length - 1; // 两个指针两端扫描 while (begin <...原创 2018-12-05 16:56:56 · 141 阅读 · 0 评论 -
五:寻找最小的k个数
通过全部排序O(nlogn),部分排序O(nk),用堆代替数组O(nlogk)都可以完成还可以通过线性选择算法:O(n) 选取数组S中一个元素作为主元(pivot)v,将集合S-{v}分割成Sa和Sb,就像快速排序那样: 1)如果k <= |Sa|,那么第k个最小的元素必然在Sa中,这时,返回QuickSelect(Sa,k); 2)如果k...原创 2018-12-05 16:55:17 · 151 阅读 · 0 评论 -
四:最长回文子串
1:中心扩展法int LongestPalindrome(const char *s, int n){ int i,j,max,c; if (s == 0 || n < 1) { return 0; } max = 0; // i为回文的中心位置 for (i = 0; i < n; ++i) { ...原创 2018-12-05 16:53:39 · 83 阅读 · 0 评论 -
编程之美2:程序只用一个字节变量,打印将帅位置
原创:https://blog.csdn.net/ndzjx/article/details/84404320#include <stdio.h>#include <windows.h>#include <time.h>#include <math.h>int main(){// BYTE i = -1;// w...原创 2018-11-23 22:08:52 · 142 阅读 · 0 评论 -
编程之美1:CPU打印直线,曲线
原创:https://blog.csdn.net/ndzjx/article/details/844042681:本质:每次循环的CPU比例问题。CPU调度时间片,大约为20ms2.2GHz是CPU时钟周期,= 22亿次 = 2.2*10^9每个时钟周期平均执行2条汇编指令#include <stdio.h>#include <windows.h>...原创 2018-11-23 22:05:16 · 259 阅读 · 0 评论 -
外部排序
外部排序:1:生成若干初始归并段 2:多路归并当文件很大,内存放不下,对文件进行排序就要用外部排序。假设文件Fin中数据是12个数,而内存只能放4个,那么过程如下:1:先取4个把内存填满,新建文件F12:从内存中去最小的一个数放到F1中3:若Fin中还有数,就取出放到内存(保持内存总是满的)4:从内存取最小的并且大于之前取出的,继续放到F1重复2,3,4,直到内存原创 2015-01-06 16:03:21 · 452 阅读 · 0 评论 -
线索化二叉树注意点
n个结点,有n+1个空指针,利用这些空指针存放某种遍历次序下该结点的前驱结点和后继结点的指针,这些指针成为线索,加上线索的二叉树成为线索二叉树。线索化即是遍历过程中给空指针赋相应的值。例如中序线索化:1:线索化左子树2:若p->lchild为空,则置p->ltag=1,且p->lchild=pre; 若pre->rchild为空,则置pre->rtag=1,且pre->rch原创 2015-01-04 10:33:03 · 633 阅读 · 0 评论 -
已知二叉树后序中序,构造二叉树
BTNode *CreateBT2(char *post,char *in,int n){ BTNode *s; char r,*p; int k; if(n<=0) return NULL; r=*(post+n-1); s=(BTNode *)malloc(sizeof(BTNode)); s->data=r; for(p=in;p<in+n;p++) if(*p==原创 2015-01-04 10:29:34 · 570 阅读 · 0 评论 -
排序算法总结
排序算法注意点:插入类排序:1:直接插入排序O(n^2) 2:折半插入排序O(n^2)3:希尔排序 O(n乘以log以2为底,n的对数)空间复杂度都是O(1)交换类排序:1:冒泡排序O(n^2),空间复杂度O(1) 2:快速排序O(n乘以log以2为底,原创 2015-01-06 16:06:13 · 817 阅读 · 1 评论 -
基数排序
基数排序:时间O(d(n+rd)) d:关键字个数,n:元素数,rd:关键字的取值范围 空间O(rd)注:对于数值类排序,只能从低位到高位进行基数排序,能有序,(高到低,不行)void RadixSort(int *&p,int r,int d)//p为带排序的单链表指针,r为基数,d为关键字位数{ int *head[MAXR],*tail[MAXR],*t; in原创 2015-01-06 16:01:59 · 737 阅读 · 0 评论 -
插入类排序:直插,折半插,希尔
插入类排序:1:直接插入排序O(n^2) 2:折半插入排序O(n^2) 3:希尔排序 O(n乘以log以2为底,n的对数) 空间复杂度都是O(1)//直接插入排序void InsertSort(int R[],int n){ int i,j; int tmp; for(i=1;i<n;i++)//数组下标从0开始,第一个有序,所以从1原创 2015-01-06 15:49:49 · 1007 阅读 · 0 评论 -
查找:顺序查找,折半查找
//顺序查找//平均查找长度ASL=(1+n)/2int Search(int a[],int n,int k){ int i; for(i=1;i<=n;i++) { if(a[i]==k) return i; } return 0;}//折半查找//时间复杂度O(log以2为底n的对数)//平均查找长度log以2为底n+1的对数,再减1int Bsearc原创 2015-01-06 16:50:04 · 657 阅读 · 0 评论 -
二路归并排序
二路归并排序:O(n乘以log以2为底,n的对数),空间复杂度O(n)//将R[low,mid]与R[mid+1,high]合并,使最后R[low,high]有序void Merge(int R[],int low,int mid,int high){ int *R1=(int *)malloc((high-low+1)*sizeof(int)); int i=low,j=mid+1,原创 2015-01-06 15:59:49 · 455 阅读 · 0 评论 -
选择类排序:选择排序,堆排序
选择类排序:1:简单选择排序O(n^2),空间O(1) 2:堆排序O(n乘以log以2为底,n的对数),空间复杂度O(1)//选择排序void SelectSort(int R[],int n){ int i,j,k; int tmp; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) { if(R[原创 2015-01-06 15:58:45 · 677 阅读 · 0 评论 -
二叉排序树:查找,插入,构造
//二叉排序树存储结构typedef struct BTNode{ int key; struct BTNode *lchild; struct BTNode *rchild;}BTNode;//二叉排序树查找算法BTNode *BSTSearch(BTNode *bt,int key){ if(bt==NULL) return NULL; else { if(b原创 2015-01-06 16:52:25 · 609 阅读 · 0 评论 -
二叉树的先序递归,非递归遍历
void PreOrder(BTNode *b){ if(b!=NULL) { Printf(“%c”,b->data); PreOrder(b->lchild); PreOrder(b->rchild); }}void PreOrder(BTNode *b){ BTNode *St[MaxSize],*p; int top=-1; if(b!=NULL) {原创 2015-01-04 10:16:02 · 447 阅读 · 0 评论 -
二叉树层次遍历与递归释放
void LevelOrder(BTNode *b){ BTNode *p; BTNode *qu[MaxSize]; int front,rear; front=rear=0; rear++; qu[rear]=b; while(front!=rear) { front=(front+1)%MaxSize; p=qu[front]; printf(“%c”,p->d原创 2015-01-04 10:22:24 · 683 阅读 · 0 评论 -
那些年我写的哈夫曼树(i love you.)
/*一级指针要改*/#include "stdio.h"#include #include #include #define MAXVALUE 1000#define MAXSIZE 29#define MAXBIT 10typedef struct hnode{ int weight,parent,lchild,rchild;}hnode,*htree;typedef c原创 2015-01-04 10:46:45 · 656 阅读 · 0 评论 -
图的深度<-->广度 优先遍历
//邻接矩阵数据类型定义#define MAXV 最大顶点个数typedef char ElemType;typedef struct{int no;ElemType info;}VertexType;typedef struct{int edges[MAXV][MAXV];int n,e;VertexType vexs[MAXV];}MGrap原创 2015-01-06 10:27:24 · 653 阅读 · 0 评论 -
最优最短路径,迪杰斯特拉和弗洛伊德
//最优最短路径//Dijkstra(迪杰斯特拉)一个顶点到其余各顶点的最短路径O(n^2)//Floyd(弗洛伊德)任意两顶点的最小路径 O(n^3)void Dijkstra(MGraph g,int v,int dist[],int path[]){int set[maxSize];int min,i,j,u;//初始化for(i=1;i{dist[i原创 2015-01-06 10:33:21 · 1054 阅读 · 0 评论 -
最小生成树,普里母和克鲁斯卡尔
//邻接矩阵数据类型定义#define MAXV 最大顶点个数typedef char ElemType;typedef struct{int no;ElemType info;}VertexType;typedef struct{int edges[MAXV][MAXV];int n,e;VertexType vexs[MAXV];}MGrap原创 2015-01-06 10:31:29 · 710 阅读 · 0 评论