算法(大部分参考网上现有资料整理而得)
JerroLuo
这个作者很懒,什么都没留下…
展开
-
字符串全排列
/*方法1:依次从字符串中取出一个字符作为最终排列的第一个字符,对剩余字符组成的字符串生成全排列,最终结果为取出的字符和剩余子串全排列的组合。#include <iostream>#include <string>using namespace std; void permute1(string prefix, string str){ if(st...原创 2018-02-26 22:25:19 · 779 阅读 · 0 评论 -
字符串替换
//字符串替换空格:实现一个函数,把字符串里的空格替换成“%20”//另外一种较为浪费空间的思路就是新建一个数组。。一个个判断空格就替换成%20 #include <stdio.h> //#include <assert.h> void replace(char *src) { //assert(src); //检查字符串定义 in...原创 2018-02-26 22:21:57 · 227 阅读 · 0 评论 -
最长同一字符组成的子字符串
//编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。//假如有相同大小长度的子字符串 怎么输出两个呢? //用两个函数,一个记录最大的子字符串 一个输出字符串 #include<stdio.h>#include<string.h>#include<stdlib.h> void print(char ch...原创 2018-02-26 22:21:19 · 560 阅读 · 0 评论 -
快速排序
/* 恩,重头戏开始了,快速排序是各种笔试面试最爱考的排序算法之一, 且排序思想在很多算法题里面被广泛使用。是需要重点掌握的排序算法。 其基本思想是基本思想是,通过一趟排序将待排记录分隔成独立的两部分, 其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分 记录继续进行排序,以达到整个序列有序。 1、从数列中挑出一个元素,称为 "基准"(pivot), 2、...原创 2018-02-26 22:20:05 · 233 阅读 · 0 评论 -
二分插入排序
#include<stdio.h>/* 这个其实是对直接插入排序的优化 在搜索上用二叉搜索 而不是一个个比较 当n较大时,比直接插入排序的最大比较次数少得多 二叉直接插入排序和二叉排序树还是有点不同的...二叉排序树排序是通过构造排序二叉树实现的 */ void print(int *a){ int i; for(i = 0; i < 7;i++){ ...原创 2018-02-26 22:11:27 · 285 阅读 · 0 评论 -
希尔排序
/* 希尔排序 就是把原来序列 分成按照距离d 一般的初次取序列的一半为增量,以后每次减半,直到增量为1。 希尔排序的思想是在宏观上进行调控,有助于在微观排序上提升性能 组内的排序同样是直接插入排序 */#include <stdio.h>void print(int *a){ int i; for(i = 0; i < 7;i++){ printf("...原创 2018-02-26 22:09:22 · 228 阅读 · 0 评论 -
直接选择排序
#include<stdio.h>/* 直接选择排序 是类似冒泡啊 直接插入排序这一类的 但是他是每次直接选择出最大的和最后一个交换,然后第二次就是倒数第二个。。。以此类推 不需要一直相邻的交换 当然也可以选择小元素放前面 */ void print(int *a){ int i; for(i = 0; i < 7;i++){ printf("%d ",a[...原创 2018-02-26 22:07:52 · 172 阅读 · 0 评论 -
冒泡排序
#include<stdio.h>/* 冒泡排序好理解,稳定,空间复杂度低,不需要额外开辟数组元素的临时保存控件,编写容易。 其算法很简单,就是比较数组相邻的两个值,把大的像泡泡一样“冒”到数组后面去,一共要执行N的平方除以2这么多次的比较和交换的操作(N为数组元素),其复杂度为Ο(n2)*/void print(int *a){ int i; for(i = 0; i...原创 2018-02-26 22:08:43 · 343 阅读 · 0 评论 -
直接插入排序
#include<stdio.h>#include<malloc.h>/* 直接插入排序即是在要排序的数组中,假设前n-1(n>=2)个数已经是排好序的,现在要把第n个数插入到前n个已经排好序的 数组中,使得这n个数也变成有序的,如此反复循环,使得要排序的数组中的最后一个元素也排好序, 我们可以先假设第一个数是排好序的,然后第二个数和第一个数进行比较,...原创 2018-02-26 22:06:43 · 207 阅读 · 0 评论 -
归并排序
/* 归并排序是建立在归并操作上的一种有效的排序算法。 该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一种稳定的排序方法。 将已有序的子序列合并,得到完全有序的序列; 即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。 归并排序具体算法描述如下(递归版本): 1、Divide: 把长度为n的...原创 2018-02-26 22:10:24 · 178 阅读 · 0 评论 -
堆排序
/* 建堆的过程,堆调整的过程,这些过程的时间复杂度,空间复杂度,以及如何应用在海量数据Top K问题中等等 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构, 并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 1---父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。 2---每个结点的左子...原创 2018-02-26 22:14:32 · 233 阅读 · 0 评论 -
桶排序
/*桶排序可用于最大最小值相差较大的数据情况,比如[9012,19702,39867,68957,83556,102456]。但桶排序要求数据的分布必须均匀,否则可能导致数据都集中到一个桶中。比如[104,150,123,132,20000], 这种数据会导致前4个数都集中到同一个桶中。导致桶排序失效。 桶排序只要能恰当的恰到好处的实现桶的构造,可以大大优化性能 关键在于桶的设计。而且桶...原创 2018-02-26 22:13:59 · 325 阅读 · 0 评论 -
计数排序
/* 计数排序需要占用大量空间,它仅适用于数据比较集中的情况。比如 [0~100],[10000~19999] 这样的数据。 计数排序是桶排序的一种特殊情况,可以把计数排序当成每个桶里只有一个元素的情况。计数排序的基本思想是:对每一个输入的元素arr[i],确定小于 arr[i] 的元素个数。 所以可以直接把 arr[i] 放到它输出数组中的位置上。假设有5个数小于 arr[i], 所以...原创 2018-02-26 22:13:18 · 273 阅读 · 0 评论 -
基数排序
#include<stdio.h>/*基数排序更适合用于对时间、字符串等这些整体权值未知的数据进行排序基数排序已经不再是一种常规的排序方式,它更多地像一种排序方法的应用,基数排序必须依赖于另外的排序方法。基数排序的总体思路就是将待排序数据拆分成多个关键字进行排序,也就是说,基数排序的实质是多关键字排序。如果按照习惯思维,会先比较百位,百位大的数据大,百位相同的再比较十位...原创 2018-02-26 22:12:37 · 205 阅读 · 0 评论 -
字符串查找
/* 判断大字符串是否包含某个子字符串 一般匹配字符串时,我们从目标字符串str(假设长度为n)的第一个下标选取和ptr长度(长度为m) 一样的子字符串进行比较,如果一样,就返回开始处的下标值, 不一样,选取str下一个下标,同样选取长度为n的字符串进行比较,直到str的末尾(实际比较时,下标移动到n-m)。 这样的时间复杂度是O(n*m)。 普通实现: int strStr(con...原创 2018-02-26 22:26:46 · 459 阅读 · 0 评论