通过LeecodeAnimation学习数据结构与算法(0)上

引用: https://mp.weixin.qq.com/s/vn3KiV-ez79FmbZ36SX9lg

  1. 冒泡排序(Buddle Sort)
    1.1 算法步骤
    比较相邻的元素。如果第一个比第二个大,就交换他们两个。

    对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

    针对所有的元素重复以上的步骤,除了最后一个。

    持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    1.2 动画演示

    1.3 使用C++自己实现代码如下:

#include <iostream>
void Buddle_sort(int A[],int n)
{int temp;for(int j=n-2;j>-1;j--)for(int i=j;i>-1;i--){if(A[i]>A[i+1]){temp=A[i];A[i]=A[i+1];A[i+1]=temp;}}}int main() {int A[]={4,2,3,1,5};Buddle_sort(A,5);for(int i=0;i<5;i++)std::cout<<A[i];std::cout<<"\n";return 0;
}
  1. 选择排序(Selection Sort)
    2.1 算法步骤
    首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置

    再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

    重复第二步,直到所有元素均排序完毕。

    2.2 动画演示

    2.3 c++代码如下:

#include <iostream>
void Selection_Sort(int* A,int n)
{int min;int minn;int temp;for(int i=0;i<n;i++){min=A[i];minn=i;for(int j=i;j<n;j++){if(min>A[j]){min=A[j];minn=j;}}if(minn!=i){temp=A[i];A[i]=A[minn];A[minn]=temp;}}
}
int main() {int B[]={5,2,3,4,1};Selection_Sort(B,5);for(int i=0;i<5;i++)std::cout<<B[i];std::cout<<"\n";return 0;
}
  1. 插入排序(Insertion Sort)
    3.1 算法步骤
    将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。

    从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

    3.2 动画演示

    3.3 C++代码如下:

#include <iostream>
void Insertion_Sort(int* A,int n)
{int tmp;for(int i=1;i<n;i++){tmp=A[i];for(int j=i;j>-1;j--){if(tmp<A[j-1]){A[j]=A[j-1];}else{A[j]=tmp;break;}}}}
int main() {int B[]={5,2,3,4,1,6,0};int size_B=sizeof(B)/sizeof(B[0]);Insertion_Sort(B,size_B);for(int i=0;i<size_B;i++)std::cout<<B[i];std::cout<<"\n";return 0;
}
  1. 希尔排序(Shell’s Sort)
    4.1 算法步骤
    选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;

    按增量序列个数 k,对序列进行 k 趟排序;

    每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

    4.2 动画演示

    4.3 C++代码如下:

#include <iostream>
void Insertion_Sort(int* A,int n,int interval) //为了使奇偶分别插入排序成为可能
{int tmp;for(int i=interval;i<n;i+=interval){tmp=A[i];for(int j=i;j>-1;j-=interval){if(tmp<A[j-interval]){A[j]=A[j-interval];}else{A[j]=tmp;break;}}}}
void Shell_Sort(int* A,int size){int size_half=size/2;int tmp;for(int i=0;i<size_half;i++){if(A[i]>A[i+size_half]){tmp=A[i];A[i]=A[i+size_half];A[i+size_half]=tmp;}}Insertion_Sort(A,size,2);Insertion_Sort(A+1,size,2);Insertion_Sort(A,size,1);
}
int main() {int B[]={5,2,3,4,1,6,0,7};int size_B=sizeof(B)/sizeof(B[0]);Shell_Sort(B,size_B);for(int i=0;i<size_B;i++)std::cout<<B[i];std::cout<<"\n";return 0;
}
  1. 归并排序(Merge Sort)
    5.1 算法步骤
    申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;

    设定两个指针,最初位置分别为两个已经排序序列的起始位置;

    比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;

    重复步骤 3 直到某一指针达到序列尾;

    将另一序列剩下的所有元素直接复制到合并序列尾。

    5.2 动画演示

    5.3 c++代码,没有用递归,但是调试了好久(作为一个编程捉急的人来说这哪是五分钟学算法,就这个算法从原理到实现搞了一天。。。)

#include <iostream>
#include<cmath>
void merge(int* A, int* B, int interval, int n)
{int* left;int* right;int lcount;int rcount;int k = 0;for (int i = 0; i < n; i += 2 * interval){//分配右指针if (i + interval < n){right = A + i + interval;if (i + 2 * interval > n) rcount = 2*interval+i-n;else rcount = 0;}else{right = A + n - 1;rcount = interval;}//分配左指针if (i < n){lcount = 0;left = A + i;}else {lcount = interval;left = A + n - 1;}while ((k < i + 2 * interval) && (k < n)){if (*left < *right){B[k] = *left;k++;if (lcount < interval-1){left++;lcount++;}else{while ((rcount < interval) && (k < n)){B[k] = *right;rcount++;k++;right++;}}}else{B[k] = *right;k++;if (rcount < interval-1){right++;rcount++;}else{while ((lcount < interval) && (k < n)){B[k] = *left;k++;lcount++;left++;}}}}}}
void Merge_Sort(int* A, int n)
{int* B;int* C;B = (int*)malloc(n * sizeof(int));C = (int*)malloc(n * sizeof(int));int interval = 1;merge(A, B, interval, n);int i = 0;while (interval < n){if (i % 2 != 1) {merge(B, C, interval, n);}else merge(C, B, interval, n);i++;interval = pow(2, i);}if (i % 2 != 1){for (int j = 0; j < n; j++)A[j] = B[j];}else{for (int j = 0; j < n; j++)A[j] = C[j];}free(B);free(C);
}int main() {int B[] = { 5,2,4,3,6,1,0 };int size_B = sizeof(B) / sizeof(B[0]);Merge_Sort(B, size_B);for (int i = 0; i < size_B; i++)std::cout << B[i];std::cout << "\n";return 0;
}

引用: https://mp.weixin.qq.com/s/vn3KiV-ez79FmbZ36SX9lg

通过LeecodeAnimation学习数据结构与算法(0)上相关推荐

  1. 数据结构稀疏矩阵的加法十字链表_学习数据结构和算法的框架思维

    ----------- 通知:如果本站对你学习算法有帮助,请收藏网址,并推荐给你的朋友.由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜.我这 ...

  2. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  3. 数据结构与算法深入学习_我最喜欢的免费课程,用于深入学习数据结构和算法...

    数据结构与算法深入学习 by javinpaul 由javinpaul Data structures and algorithms are some of the most essential to ...

  4. 我是如何学习数据结构与算法的?

    数据结构与算法的地位对于一个程序员来说不言而喻.今天这篇文章不是来劝你们学习数据结构与算法的,也不是来和你们说数据结构与算法有多重要. 主要是最近几天后台有读者问我是如何学习数据结构与算法的,有没有什 ...

  5. labuladong的算法小抄_学习数据结构和算法的框架思维

    ----------- 通知:如果本站对你学习算法有帮助,请收藏网址,并推荐给你的朋友.由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜.我这 ...

  6. 【超全汇总】学习数据结构与算法,计算机基础知识,看这篇就够了【ZT帅地】2020-3-7

    https://blog.csdn.net/m0_37907797/article/details/104029002 由于文章有点多,并且发的文章也不是一个系列一个系列发的,不过我的文章大部分都是围 ...

  7. 【数据结构与算法】如何高效学习数据结构与算法

    前言 本文是个人基于覃超老师的<算法训练营>的学习笔记,此笔记的内容都是学习后的个人记录.个人总结.理解和思想.仅供参考学习. 很多同学在大学的时候会觉得数据结构与算法很枯燥,很多小伙伴都 ...

  8. 学习数据结构和算法前瞻

    我并非计算机科班出身,以前只对C.java.Matlab.Python语言有粗略的了解,以前写代码的时候只会考虑功能能实现就行了,并不考虑性能方面的问题,对数据结构与算法从未学习过,更不了解什么时间复 ...

  9. 02如何抓住重点,系统高效地学习数据结构与算法?

    以下内容总结自极客时间王争大佬的<数据结构与算法之美>课程,本文章仅供个人学习总结. 什么是数据结构?什么是算法? 从广义上讲,数据结构就是指一组数据的存储结构.算法就是操作数据的一组方法 ...

  10. 如何抓住重点,系统高效地学习数据结构与算法?

    你是否曾跟我一样,因为看不懂数据结构和算法,而一度怀疑是自己太笨?实际上,很多人在第一次接触这门课时,都会有这种感觉,觉得数据结构和算法很抽象,晦涩难懂,宛如天书.正是这个原因,让很多初学者对这门课望 ...

最新文章

  1. C运算符的优先级和结合律 图片类型展示!
  2. python最快的循环方法_【转】【Python效率】五种Pandas循环方法效率对比
  3. Linux Shell 从入门到删除根目录跑路指南
  4. linux创建目录的语句,Linux的 文件 和 目录 管理(基本语句)
  5. Hamcrest匹配器常用方法总结
  6. C语言---链表的基本应用
  7. LVS + Keepalived 高可用群集
  8. linux下redis开机自启动
  9. Exploring Sparsity in Image Super-Resolution for Efficient Inference
  10. 推荐尽可能看Paul Deitel的英文原著《C how to Program, Sixth Edition》
  11. Java Stream API概述
  12. notepad拼心形_用shell脚本写个心形动画表格
  13. 微信步数日历打卡小程序
  14. linux删除文件夹或者文件
  15. 在jsp中引入jQuery
  16. Halo 开源项目学习(一):项目启动
  17. ORB_SLAM2新增稠密建图代码笔记
  18. 小而美的LBS应用龙门阵——成都开发者沙龙
  19. Windows 系统如何定时运行 Python 程序或脚本
  20. Android Car automotive解析

热门文章

  1. SQL Server研习录(25)——sql server触发器、instered表和deleted表知识详解及示例分析
  2. python输入成绩判断是否及格_python小练习:读入一个考试得分,判断这个分数是哪个等级,并输出,考虑异常场景...
  3. 机场安检 matlab实现,机场安检过程改进的方案.doc
  4. Far planner之 障碍物的图搜索
  5. Intel VT学习笔记(一)—— 基础知识支持检测
  6. 7z 类库解析之 Format7zF 工程
  7. Android 产生ANR后的Trace文件的解析
  8. 描述个人品质常用英语单词一览
  9. Tencent/tencent-ml-images Readme说明
  10. unity 安卓端输出日志神器--Reporter插件