高中往事回忆
后期会持续推出敬请期待
浅谈各种排序
排序算法排序是我们在学习编程的过程中经常用的问题,这篇博客会总结一些我比较常用的一些算法,以供复习和回忆。
比较常见的排序大致分为两种,比较型排序和非比较型排序
比较型排序将元素之间两两进行比较,比较耗时间。
非比较型排序将元素进行记录,比较耗空间。
我们通常认为时间比空间重要,故经常使用牺牲空间的方式来减少运行时间
比较型排序一、插入排序一个无序数列,从左到右每次取一个数向左依次比较,直至左边有一个数比它小,则插入。
时间复杂度:O(N)~O(N2)空间复杂度:O(1)
代码部分:
#include <stdio.h>
void InsertSort(int arr[],int n)
{
for(int i=0;i<n-1;++i){ //第一个已经排好序,没必要再参与计算
int end=i; //记录有序序列当前最后元素的下标
int temp=arr[end+1]; //待插入的元素
...
浅谈二分查找
相信我们都在编程过程中遇见查找问题,而查找的方式有许多种,我们最常见的、也是使用次数最多的便是二分查找了,原理简单且不容易超时。二分查找的思想很容易理解,但大多数人都是通过记模板来使用,这篇博客将二分法做一个大概的总结,以供记忆和复习。
一、分享小故事这里引用了CSDN中Charon_cc的一个很生动形象的例子:
有一天小明到图书馆借了 N 本书,出图书馆的时候,警报响了,于是保安把小明拦下,要检查一下哪本书没有登记出借。小明正准备把每一本书在报警器下过一下,以找出引发警报的书,但是保安露出不屑的眼神:你连二分查找都不会吗?于是保安把书分成两堆,让第一堆过一下报警器,报警器响;于是再把这堆书分成两堆…… 最终,检测了 logN 次之后,保安成功的找到了那本引起警报的书,露出了得意和嘲讽的笑容。于是小明背着剩下的书走了。 从此,图书馆丢了 N - 1 本书。
多读两遍我们就会发现二分查找法的前提:
二、二分查找的前提
查找的目标只能有一个
查找的范围内元素是有序的(排序在C++里可以直接使用sort,而在C里可以使用冒泡排序等方法)
为什么是这样的一个前提呢?我们首先应该知道二 ...
最大公因数和最小公倍数(欧几里得算法)
我们在学习时经常性遇见求最大公因数和最小公倍数的问题,而使用枚举的话非常容易超时,那么我们应该怎样更快更好地解决它们呢?
最大公因数欧几里得算法又称辗转相除法,使用int类型的函数实现,两个参数的传入条件要求a大于b。百度百科:欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。总之就是不断把除数当被除数,余数当除数假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:1997 ÷ 615 = 3 (余 152)615 ÷ 152 = 4(余7)152 ÷ 7 = 21(余5)7 ÷ 5 = 1 (余2)5 ÷ 2 = 2 (余1)2 ÷ 1 = 2 (余0)至此,最大公约数为1以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。
#include <stdio.h>
int gcd(int a,int b)
{
int t;
...