算法题
算法记录
Step to Step_001
这个作者很懒,什么都没留下…
展开
-
模板——快速排序(2种写法)
#include <iostream>#include <vector>#include <math.h>using std::cout;using std::endl;using std::vector;template<typename T,typename Compare=std::less<T>>//std::less就是operator<()class MyQsort{public: MyQsort(.原创 2021-04-20 20:57:21 · 731 阅读 · 0 评论 -
有1001个元素的数组,元素都是1~1000的整数,只有一个元素是重复的,找出重复元素
方法一:申请1个新数组记录每个元素出现的次数,然后扫描这个新数组方法二:先把重复的元素剔除一个,只留下不重复的1000个元素。则这1000个数必定是:1,2,3,..... ,1000。1000个元素的求和结果为S, S=1+2+...+1000。假设原来1001个元素的求和结果为T, 则重复的元素a=T-S。#include <stdio.h>#include <stdlib.h>#include <time.h>#define MA..原创 2021-02-14 01:39:13 · 1006 阅读 · 1 评论 -
找出数组中的两个元素x和y使得abs(x - y)值最小
思路:先对数组进行排序,排序后的结果:a0 a1 a2 .... an在{|a0-a1| |a1-a2| |a2-a3| ....|an-1-an|}中找到最小值#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<math.h>int main(){ int A[20] = { 1,12,20,7,3,17,4 }; int size = 7; for (int i = 0; i &l...原创 2021-02-14 01:08:02 · 527 阅读 · 0 评论 -
求三个有序数组的公共元素
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>//把数组A,B相同的元素存进数组Cvoid findComElement(int *A,int *B,int *C,int n1,int n2,int *p){ int i = 0 , j = 0 , k = 0; while (i < n1 && j < n2) { if (A[i] < B[j]) i++; else if (A[.原创 2021-02-13 23:28:37 · 530 阅读 · 0 评论 -
寻找数组中的最大值和次大值
#include<stdio.h>int main(){ int A[7] = { 1,2,3,4,5,6 }; printf("数组:"); for (int i = 0; i < 6; i++) printf("%d ", A[i]); printf("\n"); int one = (A[0] > A[1]) ? A[0] : A[1]; //one是最大值 int two = (A[0] < A[1]) ? A[0] : A[1]; //two是.原创 2021-02-13 22:38:19 · 2175 阅读 · 0 评论 -
n个整型元素的数组a,找出出现次数超过n / 2的元素
来看这样一个例子:5 1 5 4 1 1 3 1 2 1 1一共11个数字,其中1一共出现了6次。那么如何快速的找到这个6呢?我们来考虑这样一个现实生活中的例子:有一群人在打群架,他们每个人有一个编号,代表自己所处的势力,现在这一群人按照顺序依次往广场中央走,如果广场内现在有和自己不是一个势力的人,那么他就和其中一个同归于尽,问,最后哪一个势力的人会获胜?我们按照这个意思,再来看一下刚才这个例子:1)势力5的一个人走进广场中央,现在广场中央有一个人,势力是52)势力1的一个人走进广场中央,.原创 2021-02-13 22:13:18 · 1199 阅读 · 0 评论 -
统计一个整型数字的内存内容中有多少个1
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#define MAX 10000int main(){ int n; scanf("%d" , &n); int x = 1,m=0; for (int i = 1; i < 32; i++ , x = x << 1) { //整型32位,每一位1都和n进行&运算,如果n的这一位不为1,结果肯定不为0 if ((x&n) != 0).原创 2021-02-13 21:46:30 · 249 阅读 · 0 评论 -
堆排序
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#define N 10#define SWAP(a,b) {int t=a;a=b;b=t;}//数组下标从0开始//left是堆顶的下标,编号是left+1//左孩子编号2*left+2,下标是2*left+1//右孩子编号2*left+3,下标是2*left+2void adjustMaxHeap(int *p , int l.原创 2021-02-13 18:12:56 · 62 阅读 · 0 评论 -
打印从(x,y)到(0,0)的所有路径
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>void route(int x , int y , char *path){ if (x == 0 && y == 0) { strcat(path , "(0,0)"); //打印路径 puts(path); //把(0,0)从路径中删除 int length = strlen(path);...原创 2021-02-13 17:57:22 · 160 阅读 · 0 评论 -
字符串排序的优化
对char s[5][10] = { "hi","hello","world","baby","ada"}进行排序直接交换字符数组,修改内存内容的时间很长:如果一个字符串100B,那交换一次,就要修改大小为100B的内存两次,效率很低。而如果交换的是字符串的指针,则效率很高,因为指针大小固定为4B,交换一次,总共只修改了8B内存int main()//数组指针的解法:低效{ char s[5][10] = { "hi","hello","world","baby","ada" }; /.原创 2021-02-13 15:42:33 · 138 阅读 · 0 评论 -
把原文件的学生进行排名后写回原文件
有一个记录学生信息的文件,每一行记录一名学生的信息,格式入下学号\t 姓名\t 性别\t 分数 1\t 分数 2\t 分数 3\n.A 要求读取文件的内容, 串成一个链表。B 按照总分递减排序将结果保存到原文件#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h> typedef struct stu{ int num; char name[100]; char ge.原创 2021-02-10 00:09:35 · 290 阅读 · 0 评论 -
统计文件里出现次数前10的单词
统计” The_Holy_Bible_Res.txt “ 中字符的个数,行数,单词的个数,统计单词的词频并打印输出词频最高的前 10 个单词及其词频#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h> #include <string.h>#define MAXKEY 10000#define SWAP(a,b) {pInfo_t t=a;a=b;b=t;}int h.原创 2021-02-09 12:33:30 · 828 阅读 · 0 评论 -
(未完)寻找第K大数的三种方法
①快排法②小顶堆法#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<time.h>#define N 20#define SWAP(a,b) {int t=a;a=b;b=t;}//数组下标从0开始//left是堆顶的下标,编号是left+1//左孩子编号2*left+2,下标是2*left+1//右孩子编号2*left+3,下标是2*left+2void adjustMinHeap(int原创 2021-02-07 23:14:00 · 257 阅读 · 0 评论 -
二叉平衡树的左旋右旋
typedef struct TNode{ int data; struct TNode *left;//指向左孩子结点 struct TNode *right;//指向右孩子结点 struct TNode *father;//指向父结点}TNode_t , *pTNode_t;void RR(pTNode_t father)//对父亲进行右旋{ pTNode_t ancestor=father->father; pTNode_t childRight=fath...原创 2021-02-07 22:33:31 · 92 阅读 · 0 评论 -
哈希查找
往一个字符串数组当中插入20个不同的字符串,然后输入一个字符串,使用下列哈希算法判断该字符串是否出现在数组当中,如果出现,它的下标是多少?用哈希查找的好处:不用遍历数组,只需要通过哈希函数映射到对应的位置,检查是否有该字符串即可,查找的时间复杂度近似0(1)...原创 2021-02-07 19:17:14 · 540 阅读 · 1 评论 -
二叉排序树的插入和查找
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<time.h>#define N 5typedef struct TNode{ int data; struct TNode *left;//指向左孩子结点 struct TNode *right;//指向右孩子结点 struct TNode *father;//指向父结点}TNode_t , *pT原创 2021-02-07 18:45:19 · 258 阅读 · 0 评论 -
不固定结点数的二叉树建树
用链队保存树结点信息#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<time.h>typedef struct TNode{ int data; struct TNode *left; struct TNode *right;}TNode_t , *pTNode_t;typedef struct queueNode {//队列结点 pTNode_原创 2021-02-04 23:15:33 · 149 阅读 · 0 评论 -
qsort实现非递归的快速排序
回调函数:函数的形参是函数指针原创 2021-02-04 20:31:13 · 129 阅读 · 0 评论 -
希尔排序
一种写法:void shellSort(int *p,int size)//希尔排序{ int gap=size/2; for(int i=gap;i>=1;i=i/2) { for(int j=i;j<size&&(j%i!=0||j==i);j++) {//j是1组数里面的第2个数,以下for循环实现对1组数进行直接插入排序 for(int k=j;k<size;k=k+i)原创 2021-02-04 14:29:01 · 63 阅读 · 0 评论